1. ホーム
  2. ララベル

[解決済み】Eloquent Collection。空白のカウントと検出

2022-03-27 12:36:26

質問

これは些細な質問かもしれませんが、Laravelは、Eloquentコレクションが $result = Model::where(...)->get() は、要素数のカウントだけでなく、空であることを確認します。

現在、私たちは !$result を使用して空の結果を検出しますが、それで十分ですか?また count($result) とありますが、実際に空の場合も含めてすべてのケースをカバーしているのでしょうか?

どのように解決するのですか?

を使用する場合 ->get() は、単純に以下のどれかを使うことはできません。

if (empty($result)) { }
if (!$result) { }
if ($result) { }

なぜなら、もしあなたが dd($result); のインスタンスがあることに気づくでしょう。 Illuminate\Support\Collection は、結果がないときでも常に返されます。本質的に、あなたがチェックしているのは $a = new stdClass; if ($a) { ... } で、これは常に真を返します。

結果があるかどうかを判断するには、以下のいずれかを実行します。

if ($result->first()) { } 
if (!$result->isEmpty()) { }
if ($result->count()) { }
if (count($result)) { }

を使用することもできます。 ->first() の代わりに ->get() は、最初に見つかったモデルのインスタンスを返すクエリビルダ、もしくは null でなければ これは、データベースからの結果が1つだけであることを必要とする、あるいは期待している場合に便利です。

$result = Model::where(...)->first();
if ($result) { ... }

備考・参考文献

ボーナス情報

CollectionとQuery Builderの違いは、メソッド名が同じことが多いので、Laravelの初心者には少しわかりにくいかもしれません。そのため、どちらで作業しているのかが分かりにくい場合があります。クエリビルダは基本的に、クエリを実行し、データベースをヒットするメソッドを呼び出すまで、クエリを構築します(例えば、以下のような特定のメソッドを呼び出した場合)。 ->all() ->first() ->lists() など)。それらのメソッド また に存在します。 Collection オブジェクトで、複数の結果がある場合にクエリビルダから返されることがあります。実際にどのクラスを扱っているのかがわからない場合は var_dump(User::all()) の助けを借りて)実際にどんなクラスが返されるのか実験してみましょう。 get_class(...) ). Collectionクラスのソースコードをチェックすることを強く勧めるよ。とてもシンプルなんだ。それから、クエリビルダをチェックして、関数名の類似性を見て、実際にデータベースをヒットするタイミングを調べてみてください。