雄弁なコレクション:カウントと空の検出


272

これはささいな質問かもしれませんが、Laravelから返されたEloquentコレクション$result = Model::where(...)->get()が空であるかどうかを確認し、要素の数をカウントするための特定の方法を推奨するかどうか疑問に思っています。

!$result空の結果を検出するために現在使用していますが、それで十分ですか?に関してはcount($result)、空の結果を含むすべてのケースを実際にカバーしていますか?

回答:


581

使用->get()する場合、以下のいずれも使用することはできません。

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

なぜなら、結果がない場合でもdd($result);、のインスタンスIlluminate\Support\Collectionが常に返されることに気付くからです。基本的にチェックして$a = new stdClass; if ($a) { ... }いるのは、常にtrueを返すものです。

結果があるかどうかを判断するには、次のいずれかを実行できます。

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

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

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

ノート/リファレンス

ボーナス情報

コレクション名とクエリビルダーの違いは、Laravelの新規参入者を混乱させる可能性があります。これは、2つのメソッド名が同じであることが多いためです。そのため、何に取り組んでいるのかを理解するのは混乱する可能性があります。クエリビルダーは基本的に、クエリを実行してデータベースにアクセスするメソッドを呼び出すまで(たとえば、特定のメソッドを呼び出すとき->all() ->first() ->lists()など)、クエリを構築します。これらのメソッドはオブジェクトに存在し、Collection複数の結果がある場合、クエリビルダーから返される可能性があります。実際に使用しているクラスがわからない場合は、実際にどのクラスが返されているかを確認してみてvar_dump(User::all())ください(助けを借りて)get_class(...))。Collectionクラスのソースコードを確認することを強くお勧めします。これは非常に簡単です。次に、クエリビルダーをチェックして関数名の類似点を確認し、実際にデータベースにヒットするタイミングを調べます。


4
thx、クエリを実行するfirst()と結果がとは異なることを追加するだけです。空の結果としてget()確認できます!$resultnull
bitinn

2
@btinnはい-実行した場合、つまりModel::first()-実際にはクエリビルダーの 'first`メソッドに作用しており、コレクションには作用していないため、データベースから最初のメソッドを選択します-ただしModel::get()、Illuminate \ Supportのインスタンスを返します\ Collectionなので、そうした場合は$r = Model::get()$r->first()そのコレクション内の最初の項目が選択されます。
Gary Green、

この回答でcount($result)取り上げていないことの1つは、機能するかどうかです。その詳細を追加すると改善されます。
Mark Amery

$ result-> countとcount($ result)の違いは何ですか$ result-> countは再びデータベースにヒットしますか?そうでなければ、私はこれらが同じだと思います!
カミーD 2016

2
@pathrosそれを行う簡単な方法はありません。foreachループを使用してコレクションの各メンバーを反復処理してから、これらのチェックの1つを使用する必要があります(:と考えてくださいcount($collection->column))。
PapaHotelPapa

71

私はあなたが探していると思います:

$result->isEmpty()

これはとは異なりempty($result)ます。結果は空のコレクションになるため、これは当てはまりません。あなたの提案count($result)も良い解決策です。ドキュメントに参照が見つかりません


1
$ collection-> columnのような特定の列(プロパティ)が空/ nullかどうかを確認したい場合はどうでしょうか?
Pathros 2016年

13

上記の承認された回答に同意します。しかし、私は通常、$results->isNotEmpty()以下の方法を使用します。

if($results->isNotEmpty())
{
//do something
}

それはより冗長です if(!results->isEmpty())「!」を追加するのを忘れることがあるため、です。不要なエラーが発生する可能性があります。

このメソッドはバージョン5.3以降に存在することに注意してください。


4

Laravelには、結果の数をチェックする、空をチェックする、空でないをチェックする方法がいくつかあります。

$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.

4

使用した方がいいと思います

$result->isEmpty();

コレクションが空の場合、isEmptyメソッドはtrueを返します。それ以外の場合は、falseが返されます。


3

あなたは次のようなことをしようと思う

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

またはまた使用

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

2

できるよ

$result = Model::where(...)->count(); 

結果を数える。

あなたも使うことができます

if ($result->isEmpty()){}

結果が空かどうかを確認します。



0

したがって、Laravelは実際にはコレクションを返しますModel::all(); 。配列を使用したいコレクションを使用したくない場合は、タイプを設定できます。 (array)Model::all();次に、array_filterを使用して結果を返すことができます

$models = (array)Model::all()
$models = array_filter($models);
if(empty($models))
{
 do something
}

これにより、などの操作も可能になりますcount()


3
これをコレクションとして保持することは実際に便利です。そのため、返されるオブジェクトは、コレクションのファサードで多くの便利な機能を継承できます。
Gokigooooks 2016

0

------解決済み------

この場合、2つのケースの2つのタイプのカウントをチェックします

ケース1:

結果にレコードが1つだけ含まれている場合、他の単語は-> first()を使用してデータベースから単一の行を選択します

 if(count($result)){
     
       ...record is exist true...
  }

ケース2:

-> get()または-> all()を使用して結果に複数行の他の単語のセットが含まれる場合

  if($result->count()) {
    
         ...record is exist true...
  }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.