Lazy Collections з альтернативою cursor()
cursor() тримає з'єднання з БД відкритим. Ризиковано для довгих операцій.
lazy() використовує chunks внутрішньо. Безпечніше.
Як працює lazy():
Завантажує дані пакетами (типово 1000). Видає елементи один за одним. Закриває з'єднання між пакетами.
Продуктивність:
Ефективна пам'ять як cursor(). Безпека з'єднання як chunk(). Найкраще з обох світів.
Порада: Налаштуй розмір chunk з lazy(500) для точного налаштування.
// Ризиковано: З'єднання залишається відкритим
User::cursor()->each(function ($user) {
// Довга обробка тут може таймаутнути
$this->sendEmail($user);
});
// Краще: Chunks з lazy ітерацією
User::lazy()->each(function ($user) {
// Безпечніше для довгих операцій
$this->sendEmail($user);
});
// Власний розмір chunk
User::lazy(200)->each(function ($user) {
$this->processUser($user);
});
// Працює з фільтрами
User::where('active', true)
->orderBy('created_at')
->lazy()
->filter(fn($user) => $user->hasOrders())
->each(fn($user) => $this->sendPromo($user));