CodeIgniter 提供了查询构造器类,查询构造器容许你使用较少的代码来在数据库中 获取、新增或更新数据。有时只须要一两行代码就能完成数据库操做。CodeIgniter 并不须要为每一个数据表提供一个类,而是使用了一种更简单的接口。html
除了简单,使用查询构造器的另外一个好处就是可让你建立数据库独立的应用程序,这是由于查询语句是由每一个独立的数据库适配器生成的。另外,因为系统会自动对数据进行转义,因此它还能提供更安全的查询。sql
注解:若是你想编写本身的查询语句,你能够在数据库配置文件中禁用这个类,这样数据库核心类库和适配器将 使用 更少的资源。数据库
下面的方法用来构建 SELECT 语句。数组
$query = $this->db->get('mytable')安全
// Produces: SELECT * FROM mytable
第二和第三个参数用于设置 LIMIT 子句:ide
$query = $this->db->get('mytable', 10, 20); // Executes: SELECT * FROM mytable LIMIT 20, 10 // (in MySQL. Other databases have slightly different syntax)
你应该已经注意到了,上面的方法的结果都赋值给了一个 $query 变量,经过这个变量, 咱们能够获得查询的结果:codeigniter
$query = $this->db->get('mytable'); foreach ($query->result() as $row) { echo $row->title; }
该方法和 $this->db->get() 方法同样编译 SELECT 查询并返回查询的 SQL 语句, 可是,该方法并不执行它。ui
$sql = $this->db->get_compiled_select('mytable'); echo $sql; // Prints string: SELECT * FROM mytable
第二个参数用于设置是否重置查询(默认会重置,和使用 $this->db->get() 方法时同样):this
echo $this->db->limit(10,20)->get_compiled_select('mytable', FALSE); // Prints string: SELECT * FROM mytable LIMIT 20, 10 // (in MySQL. Other databases have slightly different syntax) echo $this->db->select('title, content, date')->get_compiled_select(); // Prints string: SELECT title, content, date FROM mytable LIMIT 20, 10
上面的例子中,最值得注意的是,第二个查询并无用到 $this->db->from() 方法, 也没有为查询指定表名参数,可是它生成的 SQL 语句中有 FROM mytable 子句。 这是由于查询并无被重置(使用 $this->db->get() 方法查询会被执行并被重置, 使用 $this->db->reset_query() 方法直接重置)。spa
这个方法基本上和上面的方法同样,但它提供了第二个参数可让你添加一个 WHERE 子句, 而不是使用 db->where() 方法:
$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);
该方法用于编写查询语句中的 SELECT 子句:
$this->db->select('title, content, date'); $query = $this->db->get('mytable'); // Executes: SELECT title, content, date FROM mytable
该方法用于编写查询语句中的 SELECT MAX(field) 部分,你可使用第二个参数(可选)重命名结果字段。
$this->db->select_max('age'); $query = $this->db->get('members'); // Produces: SELECT MAX(age) as age FROM members $this->db->select_max('age', 'member_age'); $query = $this->db->get('members'); // Produces: SELECT MAX(age) as member_age FROM members
该方法用于编写查询语句中的 SELECT MIN(field) 部分,和 select_max() 方法同样, 你可使用第二个参数(可选)重命名结果字段。
$this->db->select_min('age'); $query = $this->db->get('members'); // Produces: SELECT MIN(age) as age FROM members
该方法用于编写查询语句中的 SELECT AVG(field) 部分,和 select_max() 方法同样, 你可使用第二个参数(可选)重命名结果字段。
$this->db->select_avg('age'); $query = $this->db->get('members'); // Produces: SELECT AVG(age) as age FROM members
该方法用于编写查询语句中的 SELECT SUM(field) 部分,和 select_max() 方法同样, 你可使用第二个参数(可选)重命名结果字段。
$this->db->select_sum('age'); $query = $this->db->get('members'); // Produces: SELECT SUM(age) as age FROM members
该方法用于编写查询语句中的 FROM 子句:
$this->db->select('title, content, date'); $this->db->from('mytable'); $query = $this->db->get(); // Produces: SELECT title, content, date FROM mytable
该方法用于编写查询语句中的 JOIN 子句:
$this->db->select('*'); $this->db->from('blogs'); $this->db->join('comments', 'comments.id = blogs.id'); $query = $this->db->get(); // Produces: // SELECT * FROM blogs JOIN comments ON comments.id = blogs.id
若是你的查询中有多个链接,你能够屡次调用这个方法。
你能够传入第三个参数指定链接的类型,有这样几种选择:left,right,outer,inner,left outer 和 right outer 。
$this->db->join('comments', 'comments.id = blogs.id', 'left'); // Produces: LEFT JOIN comments ON comments.id = blogs.id
2.1.1 result()方法以**对象数组**形式返回查询结果,若是查询时败将返回**空数组**。 通常状况下,你会像下面这样在一个 foreach 循环中使用它:
$query = $this->db->query("YOUR QUERY"); foreach ($query->result() as $row) { echo $row->title; echo $row->name; echo $row->body; }
该方法是 result_object() 方法的别名。
你还能够传一个字符串参数给 result() 方法,这个字符串参数表明你想要把每一个结果转换成某个类的类名(这个类必须已经加载)
$query = $this->db->query("SELECT * FROM users;"); foreach ($query->result('User') as $user) { echo $user->name; // access attributes echo $user->reverse_name(); // or methods defined on the 'User' class }
2.1.2 result_array() 方法
这个方法以 一个纯粹的数组 形式返回查询结果,若是无结果,则返回一个空数组。通常状况下,你会像下面这样在一个 foreach 循环中使用它:
$query = $this->db->query("YOUR QUERY"); foreach ($query->result_array() as $row) { echo $row['title']; echo $row['name']; echo $row['body']; }
2.2.1 row() 方法 这个方法返回单独一行结果。若是你的查询不止一行结果,它只返回第一行。返回的结果是 对象 形式,这里是用例:
$query = $this->db->query("YOUR QUERY"); $row = $query->row(); if (isset($row)) { echo $row->title; echo $row->name; echo $row->body; }
若是你要返回特定行的数据,你能够将行号做为第一个参数传给这个方法:
$row = $query->row(5);
你还能够加上第二个参数,该参数为字符串类型,表明你想要把结果转换成某个类的类名:
$query = $this->db->query("SELECT * FROM users LIMIT 1;"); $row = $query->row(0, 'User'); echo $row->name; // access attributes echo $row->reverse_name(); // or methods defined on the 'User' class
2.2.2 row_array() 方法
这个方法除了返回结果是一个数组而不是一个对象以外,其余的和上面的 row() 方法彻底同样。举例:
$query = $this->db->query("YOUR QUERY"); $row = $query->row_array(); if (isset($row)) { echo $row['title']; echo $row['name']; echo $row['body']; }
若是你要返回特定行的数据,你能够将行号做为第一个参数传给这个方法:
另外,你可使用下面这些方法从你的结果集中获取前一个、后一个、 第一个或者最后一个结果:
$row = $query->first_row()$row = $query->last_row()$row = $query->next_row()$row = $query->previous_row()
这些方法默认返回对象,若是须要返回数组形式,将单词 "array" 做为参数传入方法便可:
$row = $query->first_row('array')$row = $query->last_row('array')$row = $query->next_row('array')$row = $query->previous_row('array')
Attention: 上面全部的这些方法都会把全部的结果加载到内存里(预读取), 当处理大结果集时最好使用 unbuffered_row() 方法。
2.2.3 unbuffered_row() 方法
$query = $this->db->query("YOUR QUERY"); while ($row = $query->unbuffered_row()) { echo $row->title; echo $row->name; echo $row->body; }
这个方法和 row()方法同样返回单独一行结果,可是它不会预读取全部的结果数据到内存中。 若是你的查询结果不止一行,它将返回当前一行,并经过内部实现的指针来移动到下一行。