Каков наилучший способ проверить, не отвечает ли запрос Eloquent?
Я использую Laravel 4. Скажу, что у меня есть модель Eloquent (Patient), и я хочу получить пациента с именем Bob, я бы сделал это:
$patient = Patient::where('name', '=', 'Bob');
Каков наилучший способ проверить, действительно ли $patient является действительной записью?
Ответы
Ответ 1
Если запрос базы данных не находит подходящих результатов, он возвращает null
. Поэтому...
$patient = Patient::where('name','=','Bob')->first();
if ( is_null($patient) ) {
App::abort(404);
}
(Примечание: в исходном вопросе вы забыли ->first()
(или ->get()
) в своем запросе. Не забывайте об этом, иначе вы получите объект Eloquent вместо результата.)
Ответ 2
используйте это:
$patient = Patient::where('name', '=', 'Bob')->firstOrFail();
он вернет модель Eulqouent по успеху или выбросит ModelNotFoundException после сбоя.
Ответ 3
Я знаю, что это старо, но это стало вторым ударом Google по поиску., для случаев, когда вы не ожидаете одной записи или не можете использовать ->firstOrFail()
(мой вариант использования - это асинхронный typeahead api, который возвращает до 10 результатов), единственное, что сработало для меня, было count():
$patient = Patient::where('name', '=', 'Bob')->get(); //you could have more than one bob
if (!count($patient)) {
return 'No records found';
}
Ответ 4
$patient = Patient::where('name','Bob')->get();
if ( $patient->isEmpty() ) {
return response(['error' => 'Record not found'], 404);
}
Ответ 5
Просто используйте empty()
из родного php, решив все, если объект null вернет true, если laravel collection
из конструктора запросов пуст (но инициализирован), он также вернет true.
$contributor = Contributor::whereVendor('web')->first();
if(empty($contributor)){
...
}
Ответ 6
Что-то вроде Patient::where('name', '=', 'Bob')->exists()
может работать. Он вернет логическое значение.
Ответ 7
используйте findOrFail($id)
в случае, если вы передаете параметр id
для извлечения одной записи
В итоге я ::find($id)->firstOrFail
синтаксиса ::find($id)->firstOrFail
который полностью заполнен ошибкой.
$patient = Patient::findOrFail($id);
Ответ 8
если "производительность" действительно имеет значение или вам не нужна модель результата, вы можете использовать метод exists для возврата логического, если для этого запроса существует какая-либо запись:
$isAtLeastOnePatientNamedBob = Patient::where('name', '=', 'Bob')->exists();