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?
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é.
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
(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
.