web-dev-qa-db-ja.com

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

2つのクエリを実行せずにこれを実行できますか?

47
Webinan

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

それぞれが必要な結果を得るための異なる方法です。

106
Matt Burrow

getCollectionを返し、むしろ複数の行をフェッチすることになっています。

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

(ps-私はコメントできませんでした)あなたの最善の策はあなたがやったようなもの、または次のようなものだと思います:

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

ああ、また:existsの代わりにcount()が、これはgetの後に使用される可能性があります。

1
ash