Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Блог

Статті, новини, туторіали та переклади від учасників спільноти

No results.
Tips 10 квітня 2026

sole() - суворе отримання одного результату

Запит має повернути рівно один запис. Повертає нуль або декілька? Це баг.

first() мовчки повертає null. sole() кидає виняток якщо не рівно один.

Коли використовувати:

  • Отримання за унікальним ідентифікатором
  • Коли декілька результатів вказують на пошкодження даних
  • Критична бізнес-логіка

Винятки що кидаються:

  • RecordsNotFoundException - нуль результатів
  • MultipleRecordsFoundException - більше одного

Порада: Використовувати у фінансових операціях де очікується рівно один запис.

// ПОГАНО: Мовчки повертає null або перший з багатьох
$user = User::where('email', $email)->first();
// Що якщо є дублікати? Мовчазний баг.

// ДОБРЕ: Гарантує рівно один результат
try {
    $user = User::where('email', $email)->sole();
    // Гарантовано єдиний користувач що підходить
} catch (RecordsNotFoundException $e) {
    // Користувач не знайдений
} catch (MultipleRecordsFoundException $e) {
    // Пошкодження даних - існують дублікати
}

// В обробці рахунків
$invoice = Invoice::where('invoice_number', $number)->sole();
// Дублікати були б серйозним багом

// firstOr vs soleOr
$user = User::where('email', $email)->soleOr(function () {
    throw new UserNotFoundException();
});

// Зі зв'язками
$user = User::with('profile')->where('id', $id)->sole();
Tips 04 квітня 2026

cursor() - потокове передавання великих наборів даних

При експорті 100,000 користувачів. get() завантажує все в пам'ять. Сервер падає.

cursor() передає результати один за одним. Константне використання пам'яті.

Як це працює:

Використовує MySQL cursor. Отримує один запис за раз. Пам'ять залишається низькою.

Коли використовувати:

  • Експорт великих наборів даних
  • Обробка величезних таблиць
  • Середовища з обмеженою пам'яттю

Компроміс:

Тримає з'єднання з базою даних відкритим довше. Не для веб-запитів, ідеально для команд.

Порада: Використовувати в консольних командах та jobs, уникай в HTTP контролерах.

20
// ПОГАНО: Завантажує 100k записів в пам'ять
$users = User::all(); // Може впасти
foreach ($users as $user) {
    $this->export($user);
}

// ДОБРЕ: Потокове передавання один за одним
foreach (User::cursor() as $user) {
    $this->export($user); // Константна пам'ять
}

// В консольній команді
public function handle()
{
    $this->output->progressStart(User::count());

    foreach (User::cursor() as $user) {
        $this->processUser($user);
        $this->output->progressAdvance();
    }

    $this->output->progressFinish();
}

// З умовами
foreach (User::where('active', true)->cursor() as $user) {
    // Обробляти тільки активних користувачів
}

Статті, новини та посібники про Laravel і PHP українською: релізи фреймворку, патерни, інструменти та досвід команд. Нижче - розбивка за категоріями й темами, якщо хочете звузити пошук.

Зараз опубліковано 244 матеріали від 3 авторів. Останній матеріал - 12 вересня 2026.