РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
278 of 1392 menu

Метод 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,
    который применяет колбэк к каждому элементу выборки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить