web-dev-qa-db-fra.com

Éloquent -> premier () si -> existe ()

Je veux obtenir la première ligne du tableau où la condition correspond:

User::where('mobile', Input::get('mobile'))->first()

Cela fonctionne bien, mais si la condition ne correspond pas, une exception est levée:

ErrorException
Trying to get property of non-object

Actuellement, je le résous comme ceci:

if (User::where('mobile', Input::get('mobile'))->exists()) {
    $user = User::where('mobile', Input::get('mobile'))->first()
}

Puis-je faire cela sans exécuter deux requêtes?

47
Webinan

Remarque: la méthode first () ne génère pas d'exception comme décrit dans la question d'origine. Si vous obtenez ce type d'exception, il y a une autre erreur dans votre code.

Le chemin correct vers l'utilisateur en premier () et vérifie le résultat:

$user = User::where('mobile', Input::get('mobile'))->first(); // model or null
if (!$user) {
   // Do stuff if it doesn't exist.
}

Autres techniques (non recommandé, frais généraux inutiles):

$user = User::where('mobile', Input::get('mobile'))->get();

if (!$user->isEmpty()){
    $firstUser = $user->first()
}

ou

try {
    $user = User::where('mobile', Input::get('mobile'))->firstOrFail();
    // Do stuff when user exists.
} catch (ErrorException $e) {
    // Do stuff if it doesn't exist.
}

ou

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

Chacun est un moyen différent d’obtenir le résultat souhaité.

106
Matt Burrow

get retourne Collection et est plutôt supposé extraire plusieurs lignes.

count est un moyen générique de vérifier le résultat:

$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
1
Jarek Tkaczyk

(ps - je ne pourrais pas commenter) Je pense que votre meilleur pari est quelque chose comme vous l'avez fait, ou similaire à:

$user = User::where('mobile', Input::get('mobile'));
$user->exists() and $user = $user->first();

Oh, aussi: count() à la place si exists, mais cela pourrait être quelque chose utilisé après get.

1
ash