查询数据

查询构造器使用指南

在使用查询构造器时,需先引入门面类:

use think\facade\Db;

查询单个数据

查询单个数据可使用find方法:

// name方法会自动加上表前缀(若有设置)
Db::name('user')->where('id', 1)->find();

最终生成的SQL语句可能是:

SELECT * FROM `think_user` WHERE  `id` = 1 LIMIT 1

find方法查询结果不存在时,返回null,否则返回结果数组。

若希望查询数据不存在时返回空数组,可使用:

Db::name('user')->where('id', 1)->findOrEmpty();

若希望在没有找到数据后抛出异常,可使用:

Db::name('user')->where('id', 1)->findOrFail();

若没有查找到数据,会抛出think\db\exception\DataNotFoundException异常。

需注意,如果没有任何查询条件且未调用order方法,find查询不会返回任何结果。

查询数据集

查询多个数据(数据集)使用select方法:

Db::name('user')->where('status', 1)->select();

最终生成的SQL语句可能是:

SELECT * FROM `think_user` WHERE `status` = 1

select方法查询结果是一个数据集对象,若需要转换为数组可使用:

Db::name('user')->where('status', 1)->select()->toArray();

若希望在没有查找到数据后抛出异常,可使用:

Db::name('user')->where('status', 1)->selectOrFail();

若没有查找到数据,同样会抛出think\db\exception\DataNotFoundException异常。

若设置了数据表前缀参数,可使用name方法进行查询;若数据表没有设置表前缀,nametable方法效果一致。

findselect方法之前可使用所有的链式操作(参考链式操作章节)方法。

值和列查询

查询某个字段的值可使用:

// 返回某个字段的值
Db::name('user')->where('id', 1)->value('name');

value方法查询结果不存在时,返回null

查询某一列的值可使用:

// 返回数组
Db::name('user')->where('status', 1)->column('name');
// 指定id字段的值作为索引
Db::name('user')->where('status', 1)->column('name', 'id');

若要返回完整数据并添加一个索引值,可使用:

// 指定id字段的值作为索引 返回所有数据
Db::name('user')->where('status', 1)->column('*', 'id');

column方法查询结果不存在时,返回空数组。

数据分批处理

若需处理大量数据库记录,可考虑使用chunk方法。该方法一次获取结果集的一小块,然后填充每一小块数据到闭包进行处理,在处理大量数据库记录时非常有用。

例如,对用户表数据进行分批处理,每次处理100个用户记录:

Db::name('user')->chunk(100, function($users) {
    foreach ($users as $user) {
        // 处理逻辑
    }
});

可通过从闭包函数中返回false来中止对后续数据集的处理:

Db::name('user')->chunk(100, function($users) {
    foreach ($users as $user) {
        // 处理结果集...
        if($user->status == 0){
            return false;
        }
    }
});

也支持在chunk方法之前调用其它查询方法,例如:

Db::name('user')
->where('score', '>', 80)
->chunk(100, function($users) {
    foreach ($users as $user) {
        // 处理逻辑
    }
});

chunk方法的处理默认根据主键查询,支持指定字段,例如:

Db::name('user')->chunk(100, function($users) {
    // 处理结果集...
    return false;
}, 'create_time');

并且支持指定处理数据的顺序:

Db::name('user')->chunk(100, function($users) {
    // 处理结果集...
    return false;
}, 'create_time', 'desc');

需注意,chunk方法一般用于命令行操作批处理数据库的数据,不适合WEB访问处理大量数据,易导致超时。

游标查询

若需处理大量数据,可使用新版提供的游标查询功能。该查询方式利用了PHP的生成器特性,可大幅减少大量数据查询的内存开销问题。

$cursor = Db::name('user')->where('status', 1)->cursor();
foreach($cursor as $user){
    echo $user['name'];
}

cursor方法返回的是一个生成器对象,user变量是数据表的一条数据(数组)。

目录
设置
主题设置
深色模式
字体设置
字体大小
16