如何获得Laravel块的返回值?

时间:2014-09-24 21:25:50

标签: php laravel

这是一个过于简化的示例,对我不起作用。如何(使用这种方法,我知道如果我真的想要这个特定的结果有更好的方法),我可以获得用户总数吗?

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

3 个答案:

答案 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();