条件が一致するテーブルの最初の行を取得したい:
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()
}
2つのクエリを実行せずにこれを実行できますか?
注: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();
}
それぞれが必要な結果を得るための異なる方法です。
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
(ps-私はコメントできませんでした)あなたの最善の策はあなたがやったようなもの、または次のようなものだと思います:
$user = User::where('mobile', Input::get('mobile'));
$user->exists() and $user = $user->first();
ああ、また:exists
の代わりにcount()
が、これはget
の後に使用される可能性があります。