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();