分块查询是为查询大量数据的需要而设计的,假如think_data
表已经有超过1万条记录,但是一次性取那么大的数据会导致内存开销非常之大,但确实又有这个需要(例如查询所有的数据并导出到excel
),采用分块查询可以缓解这个问题。
使用分块查询,可以把1万条记录分成100
次处理,每次处理100
条记录,代码示例如下:
Db::name('data')
->where('status', '>', 0)
->chunk(100, function ($list) {
// 处理100条记录
foreach($list as $data){
}
});
第二个参数可以是有效的callback
类型,包括使用闭包函数。
系统会按照主键顺序查询,每次查询100
条,如果你不希望使用主键进行查询,或者没有主键的话,则需要指定查询的排序字段(但必须是唯一的),例如:
Db::name('user')
->where('status', '>', 0)
->chunk(100, function ($list) {
// 处理100条记录
foreach($list as $data){
}
}, 'uid');
然后交给callback
进行数据处理,处理完毕后继续查询下一个100
条记录,如果你需要在中途中断后续的查询,只需要在callback
方法调用中返回false
即可,例如:
Db::name('data')
->where('status','>',0)
->chunk(100,function($list){
foreach($list as $data){
// 返回false则中断后续查询
return false;
}
});