Eloquent -> first () if -> exists ()

Я хочу получить первую строку в таблице, где условие соответствует:

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

Могу ли я сделать это без двух запросов?

Solutions Collecting From Web of "Eloquent -> first () if -> exists ()"

Примечание. Метод 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()); }