查询数据
查询构造器使用指南
在使用查询构造器时,需先引入门面类:
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
方法进行查询;若数据表没有设置表前缀,name
和table
方法效果一致。
在find
和select
方法之前可使用所有的链式操作(参考链式操作章节)方法。
值和列查询
查询某个字段的值可使用:
// 返回某个字段的值
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
变量是数据表的一条数据(数组)。