Вот упрощённый пример, который не работает для меня. Как (используя этот метод, я знаю, что есть лучшие способы, если я действительно хочу получить этот конкретный результат), могу ли я получить общее количество пользователей?
User::chunk(200, function($users) { return count($users); });
Это возвращает NULL. Любая идея, как я могу получить возвращаемое значение из функции chunk?
Редактировать:
Здесь может быть лучший пример:
$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
Я не думаю, что вы можете достичь того, чего хотите. Анонимная функция вызывается методом chunk, поэтому все, что вы возвращаете после закрытия, поглощается chunk
. Так как chunk
потенциально вызывает эту анонимную функцию N раз, нет смысла возвращать что-либо обратно из замыканий, которые она вызывает.
Однако вы можете предоставить доступ к переменной с областью действия к закрытию и позволить закрытию записывать это значение, что позволит вам косвенно возвращать результаты. Вы делаете это с use
ключевого слова 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