Я хочу получить первую строку в таблице, где условие соответствует:
User::where('mobile', Input::get('mobile'))->first()
Он работает хорошо, но если условие не соответствует, оно выдает исключение:
ErrorException Trying to get property of non-object
В настоящее время я разрешаю это следующим образом:
if (User::where('mobile', Input::get('mobile'))->exists()) { $user = User::where('mobile', Input::get('mobile'))->first() }
Могу ли я сделать это без двух запросов?
Примечание. Метод first () не генерирует исключение, как описано в исходном вопросе. Если вы получаете такое исключение, в вашем коде есть еще одна ошибка.
Правильный способ пользователя first () и проверить результат:
$user = User::where('mobile', Input::get('mobile'))->first(); // model or null if (!$user) { // Do stuff if it doesn't exist. }
Другие методы (не рекомендуется, ненужные служебные данные):
$user = User::where('mobile', Input::get('mobile'))->get(); if (!$user->isEmpty()){ $firstUser = $user->first() }
или
try { $user = User::where('mobile', Input::get('mobile'))->firstOrFail(); // Do stuff when user exists. } catch (ErrorException $e) { // Do stuff if it doesn't exist. }
или
// Use either one of the below. $users = User::where('mobile', Input::get('mobile'))->get(); //Collection if (count($users)){ // Use the collection, to get the first item use $users->first(). // Use the model if you used ->first(); }
Каждый из них – это другой способ получить требуемый результат.
(ps – я не мог комментировать) Я думаю, что ваш лучший выбор – это то, что вы сделали или похоже на:
$user = User::where('mobile', Input::get('mobile')); $user->exists() and $user = $user->first();
О, также: count()
вместо этого exists
но это может быть что-то использовано после get
.
get
returns Collection
и скорее предполагается получить несколько строк.
count
– общий способ проверки результата:
$user = User::where(...)->first(); // returns Model or null if (count($user)) // do what you want with $user // or use this: $user = User::where(...)->firstOrFail(); // returns Model or throws ModelNotFoundException // count will works with a collection of course: $users = User::where(...)->get(); // returns Collection always (might be empty) if (count($users)) // do what you want with $users
first()
всегда возвращает модель или null
. Это означает, что ou может легко проверить результат следующим образом:
$user = User::where('mobile', Input::get('mobile'))->first(); if ($user){ //use $user for whatever you wanna do } else{ // no result found }
Ответ уже принят, но в этих ситуациях более элегантным решением, на мой взгляд, будет использование обработки ошибок.
try { $user = User::where('mobile', Input::get('mobile'))->first(); } catch (ErrorException $e) { // Do stuff here that you need to do if it doesn't exist. return View::make('some.view')->with('msg', $e->getMessage()); }