С последним выпуском minor Laravel, то есть v8.23.0, в построителе запросов Laravel был введен действительно интересный метод для ситуации, когда вы хотите получить единственную запись для соответствующих критериев. Но если есть больше записей для этого критерия, должно быть какое-то исключение.
Давайте разберемся в этом подробнее.
sole()
было предложено в этом PR Мохаммедом Саидом. Такой метод есть в Django get() и Rails sole и find_sole_by.
Вот как работает этот метод.
try {
$order = Order::where('invoice_number', '#INV12345')->sole();
} catch (Illuminate\Database\Eloquent\ModelNotFoundException $e) {
// order not found
} catch (Illuminate\Database\Eloquent\MultipleRecordsFoundException $e) {
// multiple records found
}
Как вы можете заметить, метод sole()
вернет только ту запись, которая соответствует критериям, если не будет найдено ни одной записи то выбросится NoRecordsFoundException
, а если будет найдено несколько записей, то MultipleRecordsFoundException
.
Этот метод может оказаться полезным, когда вам нужна одна строка, но также вы хотите утверждать, что нет нескольких строк, соответствующих условию; особенно когда ограничений базы данных недостаточно (например, уникальных индексов в MySQL) или они непрактичны.