2014-09-24 192 views
11

这是一个过于简化的例子,不适合我。如何(使用这种方法,我知道有更好的方法,如果我真的想要这个特定的结果),我可以得到总用户数?如何获得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 
+0

等等,你想得到的总用户数,你不需要任何数据呢?似乎并不像块是最有效的方法 – Ohgodwhy 2014-09-24 21:29:10

+0

@Ohgodwhy我试图获得块函数的结果。请忽略示例的具体内容。 – Citizen 2014-09-24 21:30:13

+0

@Ohgodwhy我又增加了一个例子。 – Citizen 2014-09-24 21:34:47

回答

15

我不认为你可以实现你这样想的。匿名函数由chunk方法调用,因此您从闭包中返回的任何内容都被chunk所吞噬。由于chunk可能会将此匿名函数调用N次,因此它从它调用的闭包中返回任何内容是没有意义的。

但是您可以向闭包提供对方法范围变量的访问,并允许闭包写入该值,从而可以间接返回结果。您可以使用use关键字执行此操作,并确保通过引用传递中的方法范围变量,这通过0​​修饰符实现。

这将工作,例如;

$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 
+0

它工作!谢谢! – Citizen 2014-09-24 22:01:20

+0

如果你需要更好的控制,你也可以使用你的类的属性(在你的例子中,$ this-> count),并在块的闭包中增加它。 – 2015-09-21 16:39:06

+1

对于那些觉得这不适合他们的人,对我来说,count会重置每个块循环。我忘了将'&'参数添加到'use'语句中。如果你补充说它会正常工作。 – Maarten00 2017-07-12 11:35:39