web-dev-qa-db-ja.com

雄弁なコレクション:数えて空を検出

これは些細な問題かもしれませんが、Laravelが$result = Model::where(...)->get()から返されたEloquentコレクションが空であるかどうかをチェックする特定の方法を推奨し、要素数を数えることをお勧めします。

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

209
bitinn

->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) { ... }

ノート/参考文献

ボーナス情報

CollectionとQuery Builderの違いは、Laravelの初心者にとっては少しわかりにくいかもしれません。というのも、メソッド名は両者の間で同じであることが多いからです。そのため、自分が取り組んでいるものを知っているとわかりにくい場合があります。クエリビルダーは基本的に、クエリを実行してデータベースにアクセスするメソッドを呼び出すまでクエリを作成します(たとえば、->all()->first()->lists()などの特定のメソッドを呼び出す場合)。これらのメソッドalsoCollectionオブジェクトに存在します。複数の結果がある場合、クエリビルダーから返される可能性があります。実際にどのクラスを使用しているのかわからない場合は、var_dump(User::all())を実行して、実際にどのクラスが返されているかを確認してみてください(get_class(...)の助けを借りて)。 Collectionクラスのソースコードをチェックアウトすることを強くお勧めします。これは非常に簡単です。次に、クエリービルダーを調べて、関数名の類似点を調べ、実際にデータベースにヒットした時期を調べます。

477
Gary Green

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

$result->isEmpty()

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

61
clod986

上記の承認された回答に同意します。しかし、通常私は以下のように$results->isNotEmpty()メソッドを使います。

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

時には '!'を付け忘れているので、if(!results->isEmpty())よりも冗長です。これは望ましくないエラーにつながる可能性があります。

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

9
sathish R

私は使うほうがいいと思う

$result->isEmpty();

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

2
Jignesh Joisar

Laravelには、結果数のチェック/空のチェック/空でないチェックのためのメソッドがいくつかあります。

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

私はあなたが好きなことをしようと思う

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

または使用する

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

できるよ

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

結果を数えます。

また使用することができます

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

結果が空かどうか調べる。

1
PatrickL

------解決しよう------

この場合、あなたは2つのケースについて2つのタイプのカウントをチェックしたいです。

ケース1:

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

 if(count($result)){

       ...record is exist true...
  }

ケース2:

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

  if($result->count()) {

         ...record is exist true...
  }
0

そのため、Laravelは実際にはModel::all();を使用するときにコレクションを返します。コレクションには配列が必要ないため、setと入力できます。 (array)Model::all();そして、あなたは結果を返すためにarray_filterを使うことができます

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

これはまたあなたがcount()のようなことをすることを可能にするでしょう。

0

Laravel Documentation によると、あなたはこのように使うことができると述べています:

$result->isEmpty();

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

0
Udhav Sarvaiya