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()
}
Можно ли сделать это без двух запросов?
Ответы
Ответ 1
Примечание. Метод 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();
}
Каждый из них - это другой способ получить требуемый результат.
Ответ 2
(ps - я не мог комментировать) Я думаю, что ваш лучший выбор - это то, что вы сделали или похоже на:
$user = User::where('mobile', Input::get('mobile'));
$user->exists() and $user = $user->first();
О, также: count()
, а если exists
, но это может быть что-то использовано после get
.
Ответ 3
get
возвращает 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
Ответ 4
first()
всегда возвращает модель или null
. Это означает, что ou может легко проверить результат следующим образом:
$user = User::where('mobile', Input::get('mobile'))->first();
if ($user){
//use $user for whatever you wanna do
} else{
// no result found
}
Ответ 5
Попробуйте по-простому, и это сработает.
$userset = User::where('name',$data['name'])->first();
if(!$userset) echo "no user found";
Ответ 6
Ответ уже принят, но в этих ситуациях более элегантным решением, на мой взгляд, будет использование обработки ошибок.
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());
}