文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

CI查询构造器类(查询&生成查询结果)

2016-01-24 03:46

关注

CI查询构造器类(查询&生成查询结果)

除了简单,使用查询构造器的另一个好处就是可以让你创建数据库独立的应用程序,这是因为查询语句是由每个独立的数据库适配器生成的。另外,由于系统会自动对数据进行转义,所以它还能提供更安全的查询。

注解:如果你想编写自己的查询语句,你可以在数据库配置文件中禁用这个类,这样数据库核心类库和适配器将 使用 更少的资源。

 

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() 方法一样返回单独一行结果,但是它不会预读取所有的结果数据到内存中。 如果你的查询结果不止一行,它将返回当前一行,并通过内部实现的指针来移动到下一行。

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯