Каков наилучший способ проверить, не отвечает ли запрос 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();