Метод chunk
Метод chunk применяется к запросу Eloquent или Query Builder и позволяет обрабатывать большие наборы данных по частям. Первым параметром передаётся количество записей в одном блоке, вторым - функция-замыкание, которая будет вызвана для каждого блока. Метод автоматически выполняет запросы с смещением, пока не будут обработаны все записи.
Синтаксис
<?php
Model::chunk($count, function ($chunk) {
// Обработка блока записей
});
?>
Пример
Давайте обработаем все статьи из базы данных по 100 записей за раз:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$res = [];
Article::chunk(100, function ($articles) use (&$res) {
foreach ($articles as $article) {
$res[] = $article->title;
}
});
return $res;
}
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3", ...]
Пример
Используем метод chunk для массового обновления записей:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function updateAll()
{
$res = [];
Article::chunk(50, function ($articles) use (&$res) {
foreach ($articles as $article) {
$article->update(['status' => 'processed']);
$res[] = $article->id;
}
});
return $res;
}
}
?>
Результат выполнения кода:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]
Пример
Обработка записей с дополнительной фильтрацией перед разбиением на блоки:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function filterChunk()
{
$res = [];
Article::where('status', 'pending')
->chunk(30, function ($articles) use (&$res) {
foreach ($articles as $article) {
$res[] = $article->title . ' (processed)';
$article->status = 'processed';
$article->save();
}
});
return $res;
}
}
?>
Результат выполнения кода:
["pending article 1 (processed)", "pending article 2 (processed)", ...]