⚡ Почему это важно
Когда в таблице тысячи или миллионы записей, обычный
get() или all() загрузит все строки в память сразу — это:❌ сильно расточительно по памяти,
❌ может привести к падению по OOM,
❌ скрипт может не успеть выполнить работу целиком.
Для таких ситуаций Laravel предлагает метод
chunk(), который загружает данные частями (порциями) вместо всего набора сразу. 🧰 Что делает
chunk()Метод
chunk() берет определённое количество записей за раз и передает их в callback для обработки. Laravel автоматически загрузит следующую партию после завершения предыдущей.
use App\Models\User;
User::chunk(200, function ($users) {
foreach ($users as $user) {
// обработка каждого пользователя
}
});
📌 В этом примере Laravel:
загружает 200 пользователей за раз,
обрабатывает их,
затем переходит к следующей партии.
🧠 Почему это круто
✨ Снижение пикового потребления памяти
Вместо загрузки всей таблицы в память — всего 200 записей. Это позволяет обрабатывать десятки и сотни тысяч строк без OOM.
✨ Меньше рисков таймаута
Когда вы делаете работу по частям, выполнение разбивается на небольшие, предсказуемые блоки.
✨ Гибкость для batch-обновлений/экспортов
Дизайн идеально подходит для миграций, обновлений атрибутов, экспортов CSV и фоновых задач.
🔍 Немного про
chunkById() и улучшенияЕсли код обновляет записи внутри цикла, обычный
chunk() может вести себя непредсказуемо, потому что набор может меняться. В таких случаях лучше использовать chunkById(), который гарантирует постоянный порядок по id и предотвращает пропуски/повторы при обновлениях.
User::chunkById(200, function ($users) {
foreach ($users as $user) {
$user->update(['active' => true]);
}
});
🧠 Продвинутые приёмы
💡 Жадная загрузка связей: если в обработке вам нужны связи (
->with('profile')), загружайте их вместе с батчами — это предотвращает N+1-проблемы внутри chunk.
User::with('orders')->chunk(200, function ($users) {
foreach ($users as $user) {
// $user->orders уже загружены
}
});
💡 Используйте в фоновых командах или джобах:
chunk() отлично подходит для консольных команд и jobs, которые работают с большими массивами данных и не должны завершиться по таймауту.🧠 Когда chunk — не лучший выбор
❗ Если вам нужно просто вывести данные на страницу пользователю — лучше использовать пагинацию, а не chunk. chunk больше для обработки данных внутри приложения, а не для отдачи клиенту.
Библиотека пхпшника