123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8" lang="utf-8">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0" />
- <title>Active Record 模式 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档</title>
- <link rel="shortcut icon" href="http://codeigniter.org.cn/user_guide/../images/design/favicon.ico" type="image/x-icon" />
- <link rel="stylesheet" type="text/css" media="all" href="../userguide.css" />
- <link rel="search" href="http://codeigniter.org.cn/user_guide/../CodeIgniterSearch.xml" type="application/opensearchdescription+xml" title="CodeIgniter 搜索"/>
- <link rel="canonical" href="http://codeigniter.org.cn/user_guide/database/active_record.html" />
- <script type="text/javascript" src="../nav/mootools.js-ver=20130324.js"></script>
- <script type="text/javascript" src="../nav/mootools-more.js-ver=20130324.js"></script>
- <script type="text/javascript" src="../nav/nav.js-ver=20130324.js"></script>
- <script type="text/javascript" src="../nav/user_guide_menu.js-ver=20130324.js"></script>
- <meta name="robots" content="all" />
- <meta name="author" content="ExpressionEngine Dev Team" />
- <meta name="description" content="CodeIgniter 中文手册, CodeIgniter 用户指南, CodeIgniter User Guide, Wiki 文档" />
- </head>
- <body>
- <!-- START NAVIGATION -->
- <div id="nav">
- <div id="nav_inner">
- <script type="text/javascript">create_menu('../');</script>
- </div>
- </div>
- <script type="text/javascript">_setNavigation();</script>
- <div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="切换目录" alt="切换目录" /></a></div>
- <div id="masthead" class="clearfix">
- <div class="topbar-hd"><h1>CodeIgniter 用户指南 版本 2.2.0</h1></div>
- <div class="topbar-tip">编辑文档、查看近期更改请 <a href="#">登录</a> 或 <a href="#">注册</a> <a href="#">找回密码</a></div> <div id="breadcrumb_right"><a href="../toc.html">目录页</a></div>
- </div>
- <!-- END NAVIGATION -->
- <!-- START BREADCRUMB -->
- <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
- <tr>
- <td id="breadcrumb">
- <a href="#" target="_blank">CodeIgniter 中国首页</a> ›
- <a href="../index.html">用户指南首页</a> › <a href="index.html">数据库类</a> › Active Record 模式 </td>
- <td id="searchbox">
- <form method="get" action="http://www.google.com.hk/search" target="google_window">
- <input type="hidden" name="client" value="pub-0176846097796333"></input>
- <input type="hidden" name="forid" value="1"></input>
- <input type="hidden" name="ie" value="UTF-8"></input>
- <input type="hidden" name="oe" value="UTF-8"></input>
- <input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.org.cn/user_guide/" />
- 搜索用户指南
- <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />
-
- <input type="submit" class="submit" name="sa" value="Go" />
- </form>
- </td>
- </tr>
- </table>
- <!-- END BREADCRUMB -->
- <div style="clear:both;text-align:right;padding: 6px 40px 0 0;">
- <a href="#" target="_blank">查看原文</a>
- </div>
- <!--<br clear="all" />--><!-- START CONTENT -->
- <div id="content">
- <h1>Active Record 类</h1>
- <p>CodeIgniter 使用的是修改过的 Active Record 数据库模式。
- 这种模式是以较少的程序代码来实现信息在数据库中的获取,插入,更改。
- 有时只用一两行的代码就能完成对数据库的操作。
- CodeIgniter 不需要每一个数据库表拥有自己的类。它提供了一个更简单的接口。</p>
- <p>不只是简单,使用 Active Record 的一个主要的优点是允许你创建独立的数据库应用程序,因为查询语法是由数据库的适配器来产生的。它可以进行更安全的查询,因为系统会自动的对所有的输入值进行转义。</p>
- <p class="important"><strong>注意:</strong> 你如果想要写自己的查询表达式,可以在数据库配置文件中禁止这个类。同时相比 Active Record,使用核心数据库类库和适配器将会使用更少资源。<br /></p>
- <ul>
- <li><a href="#select">选择数据</a></li>
- <li><a href="#insert">插入数据</a></li>
- <li><a href="#update">更新数据</a></li>
- <li><a href="#delete">删除数据</a></li>
- <li><a href="#chaining">链式方法</a></li>
- <li><a href="#caching">Active Record 缓存</a></li>
- </ul>
- <a name="select"> </a>
- <h1>选择数据</h1>
- <p>下面的函数帮助你构建 SQL <strong>SELECT</strong>语句。</p>
- <p><strong>备注:如果你正在使用 PHP5,你可以在复杂情况下使用链式语法。本页面底部有具体描述。</strong></p>
- <h2>$this->db->get();</h2>
- <p>运行选择查询语句并且返回结果集。可以获取一个表的全部数据。</p>
- <code>$query = $this->db->get('mytable');<br />
- <br />
- // Produces: SELECT * FROM mytable</code>
- <p>第二和第三个参数允许你设置一个结果集每页纪录数(limit)和结果集的偏移(offset)</p>
- <code>$query = $this->db->get('mytable', 10, 20);<br />
- <br />
- // Produces: SELECT * FROM mytable LIMIT 20, 10 (MySQL语法. 其他数据库在语法上略有不同)</code>
- <p>注意:第二参数是每页纪录数,第三个参数是偏移</p>
- <p>你会注意到上面的函数由一个变量<kbd>$query</kbd>执行,这个<kbd>$query</kbd>可以用来显示结果集。</p>
- <code>$query = $this->db->get('mytable');<br />
- <br />
- foreach ($query->result() as $row)<br />
- {<br />
- echo $row->title;<br />
- }</code>
- <p>请访问<a href="results.html">查询结果</a>页查看详细的生成结果的方法。</p>
- <h2>$this->db->get_where();</h2>
- <p>跟上面的函数一样,只是它允许你在函数的第二个参数那里添加一个 where 从句,从而不用使用 db->where() 这个函数:</p>
- <code>$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);</code>
- <p>请阅读下面的 where 函数了解更多。</p>
- <p class="important">注意: get_where() 在以前的版本中写作 getwhere(),这是已经过时的用法,现已从代码中移除 getwhere()。</p>
- <h2>$this->db->select();</h2>
- <p>允许你在SQL查询中写 SELECT 部分:</p>
- <p><code>
- $this->db->select('title, content, date');<br />
- <br />
- $query = $this->db->get('mytable');<br />
- <br />
- // Produces: SELECT title, content, date FROM mytable</code></p>
- <p class="important"><strong>注意:</strong> 如果你要查询表中的所有列,你可以不用写这个函数。省略后,CodeIgniter 会认为你要查询
- 全部列(SELECT *)。</p>
- <p>$this->db->select() 可接受一个可选的第二个参数。如果你把它设为FALSE, CodeIgniter 将不会使用反引号保护你的字段或者表名
- 。这在进行复合查询时很有用。</p>
- <p><code>$this->db->select("('SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid", FALSE); <br />
- $query = $this->db->get('mytable');<br />
- </code></p>
- <h2>$this->db->select_max();</h2>
- <p>为你的查询编写一个 "SELECT MAX(field)"。你可以选择性的给出第二个参数,以便重命名结果字段名。</p>
- <p><code>
- $this->db->select_max('age');<br />
- $query = $this->db->get('members');<br />
- // Produces: SELECT MAX(age) as age FROM members<br />
- <br />
- $this->db->select_max('age', 'member_age');<br />
- $query = $this->db->get('members');<br />
- // Produces: SELECT MAX(age) as member_age FROM members</code></p>
- <h2>$this->db->select_min();</h2>
- <p>为你的查询编写一个 "SELECT MIN(field)" 。与 <dfn>select_max()</dfn> 相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。</p>
- <p><code>
- $this->db->select_min('age');<br />
- $query = $this->db->get('members');<br />
- // 生成: SELECT MIN(age) as age FROM members</code></p>
- <h2>$this->db->select_avg();</h2>
- <p>为你的查询编写一个 "SELECT AVG(field)" 。与 <dfn>select_max()</dfn> 相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。</p>
- <p><code>
- $this->db->select_avg('age');<br />
- $query = $this->db->get('members');<br />
- // 生成: SELECT AVG(age) as age FROM members</code></p>
- <h2>$this->db->select_sum();</h2>
- <p>为你的查询编写一个 "SELECT SUM(field)" 。与 <dfn>select_max()</dfn> 相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。</p>
- <p><code>
- $this->db->select_sum('age');<br />
- $query = $this->db->get('members');<br />
- // 生成: SELECT SUM(age) as age FROM members</code></p>
- <h2>$this->db->from();</h2>
- <p>允许你编写查询中的FROM部分:</p>
- <code>
- $this->db->select('title, content, date');<br />
- $this->db->from('mytable');<br />
- <br />
- $query = $this->db->get();<br />
- <br />
- // 生成: SELECT title, content, date FROM mytable</code>
- <p class="important">说明: 正如前面所说,查询中的FROM部分可以在 <dfn>$this->db->get()</dfn> 函数中指定,所以你可以根据自己的喜好来选择使用哪个方法。</p>
- <h2>$this->db->join();</h2>
- <p>允许你编写查询中的JOIN部分:</p>
- <code>
- $this->db->select('*');<br />
- $this->db->from('blogs');<br />
- $this->db->join('comments', 'comments.id = blogs.id');<br />
- <br />
- $query = $this->db->get();<br />
- <br />
- // 生成: <br />
- // SELECT * FROM blogs<br />
- // JOIN comments ON comments.id = blogs.id<br />
- </code>
- <p>如果你想要在查询中使用多个连接,可以多次调用本函数。</p>
- <p>如果你需要指定 JOIN 的类型,你可以通过本函数的第三个参数来指定。可选项包括:left, right, outer, inner, left outer, 以及 right outer.</p>
- <code>
- $this->db->join('comments', 'comments.id = blogs.id', <strong>'left'</strong>);<br />
- <br />
- // 生成: LEFT JOIN comments ON comments.id = blogs.id</code>
- <h2>$this->db->where();</h2>
- <p>本函数允许你使用四种方法中的一种来设置 <strong>WHERE</strong> 子句:</p>
- <p class="important"><strong>说明:</strong> 传递给本函数的所有值都会被自动转义,以便生成安全的查询。</p>
- <ol>
- <li><strong>简单的 key/value 方法:</strong>
- <code>$this->db->where('name', $name);
- <br /><br />// 生成: WHERE name = 'Joe'
- </code>
-
- <p>请注意等号已经为你添加。</p>
-
- <p>如果你多次调用本函数,那么这些条件会被 <var>AND</var> 连接起来:</p>
-
- <code>$this->db->where('name', $name);<br />
- $this->db->where('title', $title);<br />
- $this->db->where('status', $status);
- <br /><br />// WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
- </code>
-
- </li>
-
- <li><strong>自定义 key/value 方法:</strong>
-
- <p>你可以在第一个参数中包含一个运算符,以便控制比较:</p>
-
- <code>$this->db->where('name !=', $name);<br />
- $this->db->where('id <', $id);
- <br /><br />// 生成: WHERE name != 'Joe' AND id < 45</code></li>
- <li><strong>关联数组方法:</strong>
- <code>
- $array = array('name' => $name, 'title' => $title, 'status' => $status);<br /><br />
-
- $this->db->where($array);
- <br /><br />// 生成: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
- </code>
- <p>使用这个方法时你也可以包含运算符:</p>
- <code>
- $array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);<br /><br />
-
- $this->db->where($array);</code>
- </li>
- <li><strong>自定义字符串:</strong>
-
- <p>你可以手动的编写子句:</p>
- <code>
- $where = "name='Joe' AND status='boss' OR status='active'";<br /><br />
- $this->db->where($where);</code>
- </li>
- </ol>
- <p>$this->db->where() 接受可选的第三个参数。如果你将它设置为 FALSE, CodeIgniter 将不会为你那些包含反勾号的字段名或表名提供保护。</p>
- <p><code> $this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);<br />
- </code></p>
- <h2>$this->db->or_where();</h2>
- <p>本函数与上面的那个几乎完全相同,唯一的区别是本函数生成的子句是用 OR 来连接的:</p>
- <code>
- $this->db->where('name !=', $name);<br />
- $this->db->or_where('id >', $id);
- <br />
- <br />// 生成: WHERE name != 'Joe' OR id > 50</code>
- <p class="important">说明: or_where() 以前被叫作 orwhere(), 后者已经过时,现已从代码中移除 orwhere()。</p>
- <h2>$this->db->where_in();</h2>
- <p>生成一段 WHERE field IN ('item', 'item') 查询语句,如果合适的话,用 AND 连接起来。</p>
- <p><code>
- $names = array('Frank', 'Todd', 'James');<br />
- $this->db->where_in('username', $names);<br />
- // 生成: WHERE username IN ('Frank', 'Todd', 'James')</code></p>
- <h2>$this->db->or_where_in();</h2>
- <p>生成一段 WHERE field IN ('item', 'item') 查询语句,如果合适的话,用 OR 连接起来。</p>
- <p><code>
- $names = array('Frank', 'Todd', 'James');<br />
- $this->db->or_where_in('username', $names);<br />
- // 生成: OR username IN ('Frank', 'Todd', 'James')</code></p>
-
- <h2>$this->db->where_not_in();</h2>
- <p>生成一段 WHERE field NOT IN ('item', 'item') 查询语句,如果合适的话,用 AND 连接起来。</p>
- <p><code>
- $names = array('Frank', 'Todd', 'James');<br />
- $this->db->where_not_in('username', $names);<br />
- // 生成: WHERE username NOT IN ('Frank', 'Todd', 'James')</code></p>
- <h2>$this->db->or_where_not_in();</h2>
- <p>生成一段 WHERE field NOT IN ('item', 'item') 查询语句,如果合适的话,用 OR 连接起来。</p>
- <p><code>
- $names = array('Frank', 'Todd', 'James');<br />
- $this->db->or_where_not_in('username', $names);<br />
- // 生成: OR username NOT IN ('Frank', 'Todd', 'James')</code></p>
- <h2>$this->db->like();</h2>
- <p>本函数允许你生成 <strong>LIKE</strong> 子句,在做查询时非常有用。</p>
- <p class="important"><strong>说明:</strong> 传递给本函数的所有值都会被自动转义。</p>
- <ol>
- <li><strong>简单 key/value 方式:</strong>
- <code>$this->db->like('title', 'match');
- <br /><br />// 生成: WHERE title LIKE '%match%' </code>
-
- <p>如果你多次调用本函数,那么这些条件将由 <var>AND</var> 连接起来:</p>
-
- <code>$this->db->like('title', 'match');<br />
- $this->db->like('body', 'match');
- <br /><br />
- // WHERE title LIKE '%match%' AND body LIKE '%match%'</code>
- 如果你想要控制通配符(%)所出现的位置,你可以使用可选的第三个参数。可用的选项是 'before', 'after' 以及 'both' (这是默认值)。
- <code>$this->db->like('title', 'match', 'before');
- <br />
- // 生成: WHERE title LIKE '%match' <br />
- <br />
- $this->db->like('title', 'match', 'after'); <br />
- // 生成: WHERE title LIKE 'match%' <br />
- <br />
- $this->db->like('title', 'match', 'both'); <br />
- // 生成: WHERE title LIKE '%match%' </code> </li>
- 如果你不想使用百分号(%),你可以给第三个可选的参数传递一个'none'。
- <code>
- $this->db->like('title', 'match', 'none'); <br />
- // Produces: WHERE title LIKE 'match'
- </code>
- <li><strong>关联数组方式:</strong>
- <code>
- $array = array('title' => $match, 'page1' => $match, 'page2' => $match);<br /><br />
-
- $this->db->like($array);
- <br /><br />// WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'</code></li>
- </ol>
-
-
- <h2>$this->db->or_like();</h2>
- <p>本函数与上面那个函数几乎完全相同,唯一的区别是多个实例之间是用 OR 连接起来的:</p>
- <code>
- $this->db->like('title', 'match');<br />
- $this->db->or_like('body', $match);
- <br />
- <br />// WHERE title LIKE '%match%' OR body LIKE '%match%'</code>
-
- <p class="important">说明: or_like() 曾经被称为 orlike(), 后者已经过时,现已从代码中移除 orlike()。</p>
- <h2>$this->db->not_like();</h2>
- <p>本函数与 <strong>like()</strong> 几乎完全相同,唯一的区别是它生成 NOT LIKE 语句:</p>
- <code> $this->db->not_like('title', 'match');<br />
- <br />
- // WHERE title NOT LIKE '%match%</code>
- <h2>$this->db->or_not_like();</h2>
- <p>本函数与 <strong>not_like()</strong> 几乎完全相同,唯一的区别是多个实例之间是用 OR 连接起来的:</p>
- <code> $this->db->like('title', 'match');<br />
- $this->db->or_not_like('body', 'match'); <br />
- <br />
- // WHERE title LIKE '%match%' OR body NOT LIKE '%match%'</code>
- <h2>$this->db->group_by();</h2>
- <p>允许你编写查询语句中的 GROUP BY 部分:</p>
-
- <code>$this->db->group_by("title");
- <br /><br />// 生成: GROUP BY title
- </code>
- <p>你也可以把多个值作为数组传递过去:</p>
-
- <code>$this->db->group_by(array("title", "date"));
- <br />
- <br />// 生成: GROUP BY title, date</code>
-
- <p class="important">说明: group_by() 曾经被称为 groupby(), 后者已经过时,现已从代码中移除 groupby()。</p>
- <h2> $this->db->distinct();<br />
- </h2>
- <p>为查询语句添加 "DISTINCT" 关键字:</p>
- <p><code>$this->db->distinct();<br />
- $this->db->get('table');<br />
- <br />
- // 生成: SELECT DISTINCT * FROM table</code></p>
- <h2>$this->db->having();</h2>
- <p>允许你为你的查询语句编写 HAVING 部分。有两种语法形式,一个或两个参数都可以:</p>
-
- <code>$this->db->having('user_id = 45');
- <br />
- // 生成: HAVING user_id = 45<br />
- <br />
- $this->db->having('user_id', 45); <br />
- // 生成: HAVING user_id = 45<br />
- <br />
- </code>
-
- <p>你也可以把多个值通过数组传递过去:</p>
- <p><code>$this->db->having(array('title =' => 'My Title', 'id <' => $id)); <br />
- <br />
- // 生成: HAVING title = 'My Title' AND id < 45</code></p>
- <p>如果你正在使用一个由CodeIgniter进行转义保护的数据库,为了避免内容转义,你可以传递可选的第三个参数,并将其设置为FALSE。</p>
- <p><code>$this->db->having('user_id', 45); <br />
- // 生成: HAVING `user_id` = 45 (在诸如MySQL等数据库中)
- <br />
- $this->db->having('user_id', 45, FALSE); <br />
- // 生成: HAVING user_id = 45</code></p>
-
-
- <h2>$this->db->or_having();</h2>
- <p>与 having() 函数几乎完全一样,唯一的区别是多个子句之间是用 "OR" 分隔的。</p>
- <h2>$this->db->order_by();</h2>
- <p>帮助你设置一个 ORDER BY 子句。第一个参数是你想要排序的字段名。第二个参数设置结果的顺序,可用的选项包括 <kbd>asc</kbd> (升序)或 <kbd>desc</kbd>(降序), 或 <kbd>random</kbd>(随机)。</p>
-
- <code>$this->db->order_by("title", "desc");
- <br />
- <br />// 生成: ORDER BY title DESC
- </code>
- <p>你也可以在第一个参数中传递你自己的字符串:</p>
-
- <code>$this->db->order_by('title desc, name asc');
- <br />
- <br />// 生成: ORDER BY title DESC, name ASC
- </code>
- <p>或者,多次调用本函数就可以排序多个字段。</p>
- <p><code>$this->db->order_by("title", "desc");<br />
- $this->db->order_by("name", "asc"); <br />
- <br />
- // 生成: ORDER BY title DESC, name ASC
- </code></p>
- <p class="important">说明: order_by() 曾经被称为 orderby(), 后者已经过时,现已从代码中移除 orderby()。</p>
- <p class="important">说明: 目前 Oracle 和 MSSQL 的驱动还不支持随机排序,将被默认设置为 'ASC'(升序)。</p>
- <h2>$this->db->limit();</h2>
- <p>限制查询所返回的结果数量:</p>
- <code>
- $this->db->limit(10);<br />
- <br />
- // 生成: LIMIT 10</code>
- <p>第二个参数设置的是结果偏移量。</p>
- <code>
- $this->db->limit(10, 20);<br />
- <br />
- // 生成: LIMIT 20, 10 (仅限MySQL中。其它数据库有稍微不同的语法)</code>
- <h2>$this->db->count_all_results();</h2>
- <p>允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。范例:</p>
- <code>echo $this->db->count_all_results('<var>my_table</var>');<br />
- // 生成一个整数,例如 25<br />
- <br />
- $this->db->like('title', 'match');<br />
- $this->db->from('<var>my_table</var>');<br />
- echo $this->db->count_all_results();<br />
- // 生成一个整数,例如 17 </code>
-
- <a name="insert"> </a>
- <h1>插入数据</h1>
-
- <h2>$this->db->insert();</h2>
- <p>生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 <strong>数组</strong> 或一个 <strong>对象</strong>。下面是一个使用数组的例子:</p>
- <code>
- $data = array(<br />
- 'title' => 'My title' ,<br />
- 'name' => 'My Name' ,<br />
- 'date' => 'My date'<br />
- );<br />
- <br />
- $this->db->insert('mytable', $data);
- <br /><br />
- // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')</code>
- <p>第一个参数包含表名,第二个是一个包含数据的关联数组。</p>
- <p>下面是一个使用对象的例子:</p>
- <code>
- /*<br />
- class Myclass {<br />
- var $title = 'My Title';<br />
- var $content = 'My Content';<br />
- var $date = 'My Date';<br />
- }<br />
- */<br />
- <br />
- $object = new Myclass;<br />
- <br />
- $this->db->insert('mytable', $object);
- <br /><br />
- // Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')</code>
- <p>第一个参数包含表名,第二个是一个对象。</p>
- <p class="important"><strong>注意:</strong> 所有的值已经被自动转换为安全查询。</p>
- <h2>$this->db->insert_batch();</h2>
- <p>生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 <strong>数组</strong> 或一个 <strong>对象</strong>。下面是一个使用数组的例子:</p>
- <code>
- $data = array(<br/>
- array(<br />
- 'title' => 'My title' ,<br />
- 'name' => 'My Name' ,<br />
- 'date' => 'My date'<br />
- ),<br />
- array(<br />
- 'title' => 'Another title' ,<br />
- 'name' => 'Another Name' ,<br />
- 'date' => 'Another date'<br />
- )<br/>
- );<br />
- <br />
- $this->db->insert_batch('mytable', $data);
- <br /><br />
- //生成: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')</code>
- <p>第一个参数包含表名,第二个是一个包含数据的关联数组。</p>
- <p class="important"><strong>注意:</strong> 所有的值已经被自动转换为安全查询。</p>
- <h2>$this->db->set();</h2>
- <p>本函数使您能够设置<dfn>inserts</dfn>(插入)或<dfn>updates</dfn>(更新)值。</p>
- <p><strong>它可以用来代替那种直接传递数组给插入和更新函数的方式:</strong> </p>
- <code>$this->db->set('name', $name);
- <br />
- $this->db->insert('mytable');
- <br /><br />
- // 生成: INSERT INTO mytable (name) VALUES ('{$name}')</code>
- <p>如果你多次调用本函数,它们会被合理地组织起来,这取决于你执行的是插入操作还是更新操作:</p>
- <code>$this->db->set('name', $name);<br />
- $this->db->set('title', $title);<br />
- $this->db->set('status', $status);<br />
- $this->db->insert('mytable'); </code>
- <p><strong>set()</strong> 也接受可选的第三个参数($escape),如果此参数被设置为 FALSE,就可以阻止数据被转义。为了说明这种差异,这里将对 包含转义参数 和 不包含转义参数 这两种情况的 set() 函数做一个说明。</p>
- <p><code>$this->db->set('field', 'field+1', FALSE);<br />
- $this->db->insert('mytable'); <br />
- // 得到 INSERT INTO mytable (field) VALUES (field+1)<br />
- <br />
- $this->db->set('field', 'field+1');<br />
- $this->db->insert('mytable'); <br />
- // 得到 INSERT INTO mytable (field) VALUES ('field+1')</code></p>
- <p>你也可以将一个关联数组传递给本函数:</p>
- <code>
- $array = array('name' => $name, 'title' => $title, 'status' => $status);<br /><br />
- $this->db->set($array);<br />
- $this->db->insert('mytable');
- </code>
- <p>或者一个对象也可以:</p>
- <code>
- /*<br />
- class Myclass {<br />
- var $title = 'My Title';<br />
- var $content = 'My Content';<br />
- var $date = 'My Date';<br />
- }<br />
- */<br />
- <br />
- $object = new Myclass;<br />
- <br />
- $this->db->set($object);<br />
- $this->db->insert('mytable');
- </code>
-
- <a name="update"> </a>
- <h1>更新数据</h1>
-
- <h2>$this->db->update();</h2>
- <p>根据你提供的数据生成并执行一条update(更新)语句。你可以将一个<strong>数组</strong>或者<strong>对象</strong>传递给本函数。这里是一个使用数组的例子:</p>
- <code>
- $data = array(<br />
- 'title' => $title,<br />
- 'name' => $name,<br />
- 'date' => $date<br />
- );<br />
- <br />
- $this->db->where('id', $id);<br />
- $this->db->update('mytable', $data);
- <br /><br />
- // 生成:<br />
- // UPDATE mytable <br />
- // SET title = '{$title}', name = '{$name}', date = '{$date}'<br />
- // WHERE id = $id</code>
- <p>或者你也可以传递一个对象:</p>
- <code>
- /*<br />
- class Myclass {<br />
- var $title = 'My Title';<br />
- var $content = 'My Content';<br />
- var $date = 'My Date';<br />
- }<br />
- */<br />
- <br />
- $object = new Myclass;<br />
- <br />
- $this->db->where('id', $id);<br />
- $this->db->update('mytable', $object);
- <br />
- <br />
- // 生成:<br />
- // UPDATE mytable <br />
- // SET title = '{$title}', name = '{$name}', date = '{$date}'<br />
- // WHERE id = $id</code>
- <p class="important"><strong>说明:</strong> 所有值都会被自动转义,以便生成安全的查询。</p>
-
- <p>你会注意到 <dfn>$this->db->where()</dfn> 函数的用法,它允许你设置 WHERE 子句。你可以有选择性地将这一信息直接以字符串的形式传递给 update 函数:</p>
- <code>$this->db->update('mytable', $data, "id = 4");</code>
- <p>或者是一个数组:</p>
- <code>$this->db->update('mytable', $data, array('id' => $id));</code>
-
- <p>在进行更新时,你还可以使用上面所描述的 <dfn>$this->db->set()</dfn> 函数。</p>
- <h2>$this->db->update_batch();</h2>
- <p>生成一条update命令是以你提供的数据为基础的,并执行查询。你可以传递一个数组或对象的参数给update_batch()函数。下面是一个使用一个数组作为参数的示例:Generates an update string based on the data you supply, and runs the query. You can either pass an
- <strong>array</strong> or an <strong>object</strong> to the function. Here is an example using an array:</p>
- <code>
- $data = array(<br/>
- array(<br />
- 'title' => 'My title' ,<br />
- 'name' => 'My Name 2' ,<br />
- 'date' => 'My date 2'<br />
- ),<br />
- array(<br />
- 'title' => 'Another title' ,<br />
- 'name' => 'Another Name 2' ,<br />
- 'date' => 'Another date 2'<br />
- )<br/>
- );<br />
- <br />
- $this->db->update_batch('mytable', $data, 'title');
- <br /><br />
- // Produces: <br />
- // UPDATE `mytable` SET `name` = CASE<br />
- // WHEN `title` = 'My title' THEN 'My Name 2'<br />
- // WHEN `title` = 'Another title' THEN 'Another Name 2'<br />
- // ELSE `name` END,<br />
- // `date` = CASE <br />
- // WHEN `title` = 'My title' THEN 'My date 2'<br />
- // WHEN `title` = 'Another title' THEN 'Another date 2'<br />
- // ELSE `date` END<br />
- // WHERE `title` IN ('My title','Another title')</code>
- <p>参数1:表名 参数2:如上所示的二维数组 参数3:键名.</p>
- <p class="important"><strong>提示:</strong> 所有的值都会自动进行安全性过滤.</p>
- <a name="delete"> </a>
- <h1>删除数据</h1>
-
- <h2>$this->db->delete();</h2>
- <p>生成并执行一条DELETE(删除)语句。</p>
- <code>
- $this->db->delete('mytable', array('id' => $id));
- <br /><br />
- // 生成:<br />
- // DELETE FROM mytable <br />
- // WHERE id = $id</code>
- <p>第一个参数是表名,第二个参数是where子句。你可以不传递第二个参数,使用 <dfn>where()</dfn> 或者 <dfn>or_where()</dfn> 函数来替代它:</p>
- <p><code> $this->db->where('id', $id);<br />
- $this->db->delete('mytable'); <br />
- <br />
- // 生成:<br />
- // DELETE FROM mytable <br />
- // WHERE id = $id</code></p>
- <p>如果你想要从一个以上的表中删除数据,你可以将一个包含了多个表名的数组传递给delete()函数。</p>
- <p><code>$tables = array('table1', 'table2', 'table3');<br />
- $this->db->where('id', '5');<br />
- $this->db->delete($tables);</code></p>
- <p>如果你想要删除表中的全部数据,你可以使用 <dfn>truncate()</dfn> 函数,或者 <dfn>empty_table()</dfn> 函数。</p>
- <p class="important"><strong>说明:</strong>delete方法貌似现在没有办法接收排序参数</p>
- <p>假设我想删除早期的用户登录日志信息,我的语法可能会是根据登录时间正序排列,然后跟上limit已经有的总日志条数减去想保留的条数,delete方法没有这个参数用来接收,那么我只能直接使用query传递我的sql了</p>
- <h2>$this->db->empty_table();</h2>
- <p>生成并执行一条DELETE(删除)语句。<code> $this->db->empty_table('mytable'); <br />
- <br />
- // 生成<br />
- // DELETE FROM mytable</code></p>
- <h2>$this->db->truncate();</h2>
- <p>生成并执行一条TRUNCATE(截断)语句。</p>
- <code> $this->db->from('mytable'); <br />
- $this->db->truncate(); <br />
- // 或 <br />
- $this->db->truncate('mytable'); <br />
- <br />
- // 生成:<br />
- // TRUNCATE TABLE mytable <br />
- </code>
- <p class="important"><strong>说明:</strong> 如果 TRUNCATE 命令不可用,truncate() 将会以 "DELETE FROM table" 的方式执行。</p>
-
- <h1><a name="chaining"> </a>链式方法</h1>
- <p>链式方法允许你以连接多个函数的方式简化你的语法。考虑一下这个范例:</p>
- <code>
- <dfn>$this->db</dfn><kbd>-></kbd><var>select</var>('title')<kbd>-></kbd><var>from</var>('mytable')<kbd>-></kbd><var>where</var>('id', $id)<kbd>-></kbd><var>limit</var>(10, 20);<br />
- <br />
- $query = $this->db->get();</code>
- <p class="important"><strong>说明:</strong> 链式方法只能在PHP 5下面运行。</p>
- <p> </p>
- <h1><a name="caching"> </a>Active Record 缓存</h1>
- <p>尽管不是 "真正的" 缓存,Active Record 允许你将查询的某个特定部分保存(或"缓存")起来,以便在你的脚本执行之后重用。一般情况下,当一次Active Record调用结束,所有已存储的信息都会被重置,以便下一次调用。如果开启缓存,你就可以使信息避免被重置,方便你进行重用。</p>
- <p>缓存调用是累加的。如果你调用了两次有缓存的 select(),然后再调用两次没有缓存的 select(),这会导致 select() 被调用4次。有三个可用的缓存函数:</p>
- <h2>$this->db->start_cache()</h2>
- <p>本函数必须被用来开启缓存。所有类型正确的(下面给出了支持的查询类型) Active Record 查询都会被存储起来供以后使用。</p>
- <h2>$this->db->stop_cache()</h2>
- <p>本函数可以被用来停止缓存。</p>
- <h2>$this->db->flush_cache()</h2>
- <p>本函数从Active Record 缓存中删除全部项目。</p>
- <p>这里是一个使用范例:</p>
- <p><code>$this->db->start_cache();<br />
- $this->db->select('field1');<br />
- $this->db->stop_cache();<br /><br />
- $this->db->get('tablename');<br />
- <br />
- //Generates: SELECT `field1` FROM (`tablename`)<br />
- <br />
- $this->db->select('field2');<br />
- $this->db->get('tablename');<br />
- <br />
- //Generates: SELECT `field1`, `field2` FROM (`tablename`)<br />
- <br />
- $this->db->flush_cache();<br />
- <br />
- $this->db->select('field2');<br />
- $this->db->get('tablename');<br />
- <br />
- //Generates: SELECT `field2` FROM (`tablename`)</code></p>
- <p class="important"> <strong>说明:</strong> 下列语句能够被缓存: select, from, join, where, like, group_by, having, order_by, set</p><p> </p>
- <div id="Contributors">
- 翻译贡献者:
- atans, aykirk, Drice, Fanbin, guapibai, Hex, houlianshan, huanxiangwu, imjie, k7gxn56, localtest, loiynet, longjianghu, ripen, thankwsx, yinzhili, zhangminghua218</div>
- <div id="DocDate">
- 最后修改: 2014-01-26 23:35:03</div>
- </div>
- <!-- END CONTENT -->
- <div id="footer">
- <p>
- 上一个主题: <a href="helpers.html">查询辅助函数</a> · <a href="#top">页首</a>
- · <a href="../index.html">用户指南首页</a> · 下一个主题: <a href="transactions.html">事务</a> </p>
- <p><a href="#">CodeIgniter</a> · 版权所有 © 2006-2013 · <a href="#">Ellislab, Inc.</a></p>
- <p>中文化: <a href="#">CodeIgniter 中国</a> · 制作: Hex · 版本: 1.30 · 鸣谢: 子非鱼</p>
- </div>
- </body>
- </html>
|