Метод lazyById
Метод lazyById применяется к запросу Eloquent или Query Builder и возвращает генератор, который позволяет обрабатывать записи по одной, минимизируя потребление памяти. В отличие от метода lazy, этот метод использует сортировку по первичному ключу, что гарантирует стабильный порядок выборки и позволяет избежать проблем с дублированием записей при больших объёмах данных. Первым параметром метод принимает количество записей для загрузки за один раз, по умолчанию 1000.
Синтаксис
<?php
Model::lazyById($chunkSize = 1000);
?>
Пример
Давайте обработаем все статьи с использованием lazyById. Этот подход особенно полезен, когда нужно обработать миллионы записей, не перегружая память:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function processArticles()
{
$res = [];
foreach (Article::lazyById() as $article) {
$res[] = $article->title;
}
return $res;
}
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3", "article 4", "article 5"]
Пример
Укажем размер порции в 500 записей для более контролируемой загрузки:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function processArticles()
{
$res = [];
foreach (Article::lazyById(500) as $article) {
if ($article->status === 'published') {
$res[] = $article->title;
}
}
return $res;
}
}
?>
Результат выполнения кода:
["article 1", "article 3", "article 5"]
Пример
Используем lazyById с фильтрацией и сортировкой. Метод автоматически добавляет сортировку по id, поэтому дополнительные сортировки нужно указывать с осторожностью:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function processArticles()
{
$res = [];
foreach (Article::where('category', 'tech')->lazyById(200) as $article) {
$res[] = $article->title . ' - ' . $article->category;
}
return $res;
}
}
?>
Результат выполнения кода:
["article 1 - tech", "article 3 - tech", "article 5 - tech"]
Пример
Обработаем данные в отдельном методе с трансформацией каждого элемента. Метод lazyById поддерживает все стандартные методы построителя запросов:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function transformArticles()
{
$res = [];
$articles = Article::whereNotNull('published_at')
->orderBy('created_at', 'desc')
->lazyById(300);
foreach ($articles as $article) {
$res[] = [
'title' => $article->title,
'year' => date('Y', strtotime($article->published_at))
];
}
return $res;
}
}
?>
Результат выполнения кода:
[{"title":"article 5","year":"2026"},{"title":"article 3","year":"2025"},{"title":"article 1","year":"2024"}]
Смотрите также
-
метод
lazy,
который также обрабатывает данные порциями, но без сортировки по первичному ключу -
метод
chunk,
который разбивает выборку на порции и обрабатывает их -
метод
chunkById,
который использует сортировку по первичному ключу при разбиении на порции -
метод
each,
который применяет колбэк к каждому элементу выборки