Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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());
    }