Метод chunkById
Метод chunkById применяется к запросу Eloquent
или Query Builder и предназначен для обработки больших
наборов данных без риска превышения лимитов памяти.
В отличие от метода chunk, данный метод использует
идентификатор для пагинации, что гарантирует, что ни одна
запись не будет пропущена при изменении данных во время
обработки. Первым параметром передаётся количество записей
в одном фрагменте, вторым - имя колонки для пагинации
(по умолчанию 'id'), третьим - имя столбца для сортировки.
Синтаксис
<?php
Model::chunkById($chunkSize, $callback, $column, $alias);
?>
Пример
Давайте обработаем все статьи из базы данных по частям, выводя их заголовки:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
Article::chunkById(3, function ($articles) {
foreach ($articles as $article) {
echo $article->title . "n";
}
});
}
}
?>
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
"article 4"
"article 5"
Пример
Давайте обработаем статьи с id больше 10,
используя колонку id в качестве идентификатора:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
Article::where('id', '>', 10)
->chunkById(5, function ($articles) {
foreach ($articles as $article) {
echo $article->title . "n";
}
}, 'id');
}
}
?>
Результат выполнения кода:
"article 11"
"article 12"
"article 13"
"article 14"
"article 15"
Пример
Давайте изменим статус всех статей на 'published'
по частям, обновляя их внутри колбэка:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function updateStatus()
{
Article::chunkById(2, function ($articles) {
foreach ($articles as $article) {
$article->status = 'published';
$article->save();
echo "Updated article ID: " . $article->id . "n";
}
});
}
}
?>
Результат выполнения кода:
"Updated article ID: 1"
"Updated article ID: 2"
"Updated article ID: 3"
"Updated article ID: 4"
"Updated article ID: 5"
Смотрите также
-
метод
chunk,
который обрабатывает данные по частям с использованием смещения -
метод
lazy,
который возвращает ленивую коллекцию для больших наборов данных -
метод
cursor,
который возвращает курсор для итерации по результатам запроса -
метод
get,
который выполняет запрос и возвращает коллекцию всех записей