除了简单,使用查询构造器的另一个好处就是可以让你创建数据库独立的应用程序,这是因为查询语句是由每个独立的数据库适配器生成的。另外,由于系统会自动对数据进行转义,所以它还能提供更安全的查询。
注解:如果你想编写自己的查询语句,你可以在数据库配置文件中禁用这个类,这样数据库核心类库和适配器将 使用 更少的资源。
1. 查询
下面的方法用来构建 SELECT 语句。
1.1 $this->db->get() 执行SELECT语句并返回查询结果,可以得到一个表的所有数据:
$query = $this->db->get("mytable")
// Produces: SELECT * FROM mytable
第二和第三个参数用于设置 LIMIT 子句:
$query = $this->db->get("mytable", 10, 20);
// Executes: SELECT * FROM mytable LIMIT 20, 10
// (in MySQL. Other databases have slightly different syntax)
你应该已经注意到了,上面的方法的结果都赋值给了一个 $query 变量,通过这个变量, 我们可以得到查询的结果:
$query = $this->db->get("mytable");
foreach ($query->result() as $row)
{
echo $row->title;
}
1.2 $this->db->get_compiled_select()
该方法和 $this->db->get() 方法一样编译 SELECT 查询并返回查询的 SQL 语句, 但是,该方法并不执行它。
$sql = $this->db->get_compiled_select("mytable");
echo $sql;
// Prints string: SELECT * FROM mytable
第二个参数用于设置是否重置查询(默认会重置,和使用 $this->db->get() 方法时一样):
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() 方法直接重置)。
1.3 $this->db->get_where()
这个方法基本上和上面的方法一样,但它提供了第二个参数可以让你添加一个 WHERE 子句, 而不是使用 db->where() 方法:
$query = $this->db->get_where("mytable", array("id" => $id), $limit, $offset);
1.4 $this->db->select()
该方法用于编写查询语句中的 SELECT 子句:
$this->db->select("title, content, date");
$query = $this->db->get("mytable");
// Executes: SELECT title, content, date FROM mytable
1.5 $this->db->select_max()
该方法用于编写查询语句中的 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
1.6 $this->db->select_min()
该方法用于编写查询语句中的 SELECT MIN(field) 部分,和 select_max() 方法一样, 你可以使用第二个参数(可选)重命名结果字段。
$this->db->select_min("age");
$query = $this->db->get("members"); // Produces: SELECT MIN(age) as age FROM members
1.7 $this->db->select_avg()
该方法用于编写查询语句中的 SELECT AVG(field) 部分,和 select_max() 方法一样, 你可以使用第二个参数(可选)重命名结果字段。
$this->db->select_avg("age");
$query = $this->db->get("members"); // Produces: SELECT AVG(age) as age FROM members
1.8 $this->db->select_sum()
该方法用于编写查询语句中的 SELECT SUM(field) 部分,和 select_max() 方法一样, 你可以使用第二个参数(可选)重命名结果字段。
$this->db->select_sum("age");
$query = $this->db->get("members"); // Produces: SELECT SUM(age) as age FROM members
1.9 $this->db->from()
该方法用于编写查询语句中的 FROM 子句:
$this->db->select("title, content, date");
$this->db->from("mytable");
$query = $this->db->get(); // Produces: SELECT title, content, date FROM mytable
1.10 $this->db->join()
该方法用于编写查询语句中的 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.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 结果行
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() 方法一样返回单独一行结果,但是它不会预读取所有的结果数据到内存中。 如果你的查询结果不止一行,它将返回当前一行,并通过内部实现的指针来移动到下一行。