这是一个过于简化的示例,对我不起作用。如何(使用这种方法,我知道如果我真的想要这个特定的结果有更好的方法),我可以获得用户总数吗?
User::chunk(200, function($users)
{
return count($users);
});
返回NULL。知道如何从块函数中获取返回值吗?
编辑:
这可能是一个更好的例子:
$processed_users = DB::table('users')->chunk(200, function($users)
{
// Do something with this batch of users. Now I'd like to keep track of how many I processed. Perhaps this is a background command that runs on a scheduled task.
$processed_users = count($users);
return $processed_users;
});
echo $processed_users; // returns null
答案 0 :(得分:24)
我认为你不能以这种方式实现你想要的东西。块方法调用匿名函数,因此您从闭包中返回的任何内容都被chunk
吞噬。由于chunk
可能会调用此匿名函数N次,因此从它调用的闭包中返回任何内容是没有意义的。
但是你可以提供对闭包的方法范围变量的访问,并允许闭包写入该值,这将让你间接返回结果。您使用use
关键字执行此操作,并确保通过引用传递中的方法范围变量,这是使用&
修饰符实现的。
这将起作用;
$count = 0;
DB::table('users')->chunk(200, function($users) use (&$count)
{
Log::debug(count($users)); // will log the current iterations count
$count = $count + count($users); // will write the total count to our method var
});
Log::debug($count); // will log the total count of records
答案 1 :(得分:0)
$regions = array();
Regions::chunk(10, function($users) use (&$regions ) {
$stickers = array();
foreach ($users as $user)
{
$user->sababu = ($user->region_id > 1)? $user->region_id : 0 ;
$regions[] = $user;
}
});
echo json_encode($regions);
答案 2 :(得分:0)
使用这个自定义函数从分块数据中获取返回值
function iterateRecords($qb, int $count = 15)
{
$page = 1;
do {
$results = $qb->forPage($page, $count)->get();
$countResults = $results->count();
if ($countResults == 0) {
break;
}
foreach ($results as $row) {
yield $row;
}
unset($results);
$page++;
} while ($countResults == $count);
}
使用方法
$qb = User::select();
$users = iterateRecords($qb, 100);
foreach ($users as $user) {
echo $user->id;
}
总用户数 $totalUsersCount = $qb->count();