Блог
Статті, новини, туторіали та переклади від учасників спільноти
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();
cursor() - потокове передавання великих наборів даних
При експорті 100,000 користувачів. get() завантажує все в пам'ять. Сервер падає.
cursor() передає результати один за одним. Константне використання пам'яті.
Як це працює:
Використовує MySQL cursor. Отримує один запис за раз. Пам'ять залишається низькою.
Коли використовувати:
- Експорт великих наборів даних
- Обробка величезних таблиць
- Середовища з обмеженою пам'яттю
Компроміс:
Тримає з'єднання з базою даних відкритим довше. Не для веб-запитів, ідеально для команд.
Порада: Використовувати в консольних командах та jobs, уникай в HTTP контролерах.
// ПОГАНО: Завантажує 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.
- Категорії
- Новини 132 Tips & Tricks 53 Посібники 37 Нотатки 20 Переклади 2
- Теми
- Laravel 150 PHP 87 Eloquent 49 релізи 42 Бекенд 40 Laravel 13 35 Патерни проєктування 34 Продуктивність 26 безпека 22 пакети 20