Eloquent Collection: Leere zählen und erkennen


272

Dies mag eine triviale Frage sein, aber ich frage mich, ob Laravel eine bestimmte Methode empfiehlt, um zu überprüfen, ob eine eloquente Sammlung zurückgegeben wurde $result = Model::where(...)->get() leer ist, und um die Anzahl der Elemente zu zählen.

Wir verwenden derzeit !$result, um leere Ergebnisse zu erkennen. Ist das ausreichend? Was count($result), deckt es tatsächlich alle Fälle, einschließlich leeres Ergebnis?

Antworten:


580

Bei der Verwendung können ->get()Sie nicht einfach eines der folgenden Elemente verwenden:

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

Denn wenn Sie dd($result);feststellen, dass eine Instanz von Illuminate\Support\Collectionimmer zurückgegeben wird, auch wenn keine Ergebnisse vorliegen. Im Wesentlichen überprüfen Sie, $a = new stdClass; if ($a) { ... }was immer true zurückgibt.

Um festzustellen, ob Ergebnisse vorliegen, können Sie folgende Schritte ausführen:

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

Sie können auch ->first()anstelle von verwenden->get() Abfrage-Generators verwenden, der eine Instanz des zuerst gefundenen Modells zurückgibt, oder auf nullandere Weise. Dies ist nützlich, wenn Sie nur ein Ergebnis von der Datenbank benötigen oder erwarten.

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

Anmerkungen / Referenzen

Bonusinformationen

Die Unterschiede zwischen Collection und Query Builder können für Neulinge von Laravel etwas verwirrend sein, da die Methodennamen zwischen beiden häufig gleich sind. Aus diesem Grund kann es verwirrend sein zu wissen, an welchem ​​Sie arbeiten. Der Abfrage-Generator erstellt im Wesentlichen eine Abfrage, bis Sie eine Methode aufrufen, mit der die Abfrage ausgeführt und die Datenbank aufgerufen wird (z. B. wenn Sie bestimmte Methoden wie ->all() ->first() ->lists()und andere aufrufen ). Diese Methoden sind auch für das CollectionObjekt vorhanden, die vom Abfrage-Generator zurückgegeben werden können, wenn mehrere Ergebnisse vorliegen . Wenn Sie nicht sicher sind, mit welcher Klasse Sie tatsächlich arbeiten, versuchen Sie esvar_dump(User::all()) experimentieren, um festzustellen, welche Klassen tatsächlich zurückgegeben werden (mithilfe vonget_class(...)). Ich empfehle Ihnen dringend, den Quellcode für die Collection-Klasse zu überprüfen. Es ist ziemlich einfach. Überprüfen Sie dann den Abfrage-Generator, sehen Sie die Ähnlichkeiten in den Funktionsnamen und finden Sie heraus, wann er tatsächlich in die Datenbank gelangt.


4
thx, nur um hinzuzufügen, dass, wenn Sie Abfrage ausführen first(), das Ergebnis anders ist als get(), was mit !$resultals leeres Ergebnis überprüft werden kannnull
bitinn

2
@btinn ja - wenn Sie das getan haben, dh Model::first()- es handelt sich tatsächlich um die 'erste' Methode des Abfrage-Generators und NICHT um die Sammlung, daher wird die erste aus der Datenbank ausgewählt - es Model::get()wird jedoch eine Instanz von Illuminate \ Support zurückgegeben \ Sammlung also , wenn Sie getan haben $r = Model::get()und dann $r->first()wird es in dieser Sammlung das erste Element herausgreifen.
Gary Green

Eine Sache, die in dieser Antwort nicht angesprochen wird, ist, ob sie count($result)funktioniert. Das Hinzufügen dieses Details wäre eine Verbesserung.
Mark Amery

Was ist der Unterschied zwischen $ result-> count und count ($ result)? Trifft $ result-> count erneut auf die Datenbank? Wenn nicht, dann sind das wohl die gleichen!
Kamy D

2
@pathros Es gibt keinen einfachen Weg, das zu tun. Sie müssten jedes Mitglied der Sammlung mit einer foreachSchleife durchlaufen und dann eine dieser Prüfungen verwenden (think :) count($collection->column).
PapaHotelPapa

70

Ich denke du suchst:

$result->isEmpty()

Dies unterscheidet sich von empty($result), was nicht wahr ist, da das Ergebnis eine leere Sammlung ist. Ihr Vorschlag von count($result)ist auch eine gute Lösung. Ich kann keine Referenz in den Dokumenten finden


1
Wie wäre es, wenn Sie nur eine überprüfen möchten, ob eine bestimmte Spalte (Eigenschaft) wie in $ collection-> column leer / null ist oder nicht?
Pathros

13

Ich stimme der oben genehmigten Antwort zu. Aber normalerweise verwende ich $results->isNotEmpty()die unten angegebene Methode.

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

Es ist ausführlicher als if(!results->isEmpty())weil wir manchmal vergessen, '!' vor, was zu unerwünschten Fehlern führen kann.

Beachten Sie, dass diese Methode ab Version 5.3 vorhanden ist.


4

In Laravel gibt es verschiedene Methoden, um die Anzahl der Ergebnisse zu überprüfen / leer / nicht leer zu überprüfen:

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

4

Ich denke besser zu benutzen

$result->isEmpty();

Die isEmpty-Methode gibt true zurück, wenn die Auflistung leer ist. Andernfalls wird false zurückgegeben.


3

Ich denke du versuchst so etwas

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

oder auch verwenden

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

2

Du kannst tun

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

um die Ergebnisse zu zählen.

Sie können auch verwenden

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

um zu überprüfen, ob das Ergebnis leer ist oder nicht.


1

Gemäß den Angaben der Laravel- Dokumentation können Sie Folgendes verwenden:

$result->isEmpty();

Die isEmptyMethode gibt zurück, truewenn die Sammlung leer ist. Andernfalls falsewird zurückgegeben.


0

Laravel gibt also tatsächlich eine Sammlung zurück, wenn Model::all(); Sie nur eine Sammlung verwenden möchten. Sie möchten ein Array, damit Sie set eingeben können. (array)Model::all();Dann können Sie array_filter verwenden, um die Ergebnisse zurückzugeben

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

Auf diese Weise können Sie auch Dinge wie tun count().


3
Es ist praktisch, es als Sammlung zu behalten, damit die zurückgegebenen Objekte noch viele nützliche Funktionen in der Sammlungsfassade übernehmen können.
Gokigooooks

0

------ Gelöst ------

In diesem Fall möchten Sie zwei Arten der Zählung für zwei Cace überprüfen

Fall 1:

Wenn das Ergebnis nur einen Datensatz enthält, wählen Sie mit -> first () eine einzelne Zeile aus der Datenbank aus.

 if(count($result)){

       ...record is exist true...
  }

Fall 2:

Wenn das Ergebnis eine Reihe von mehrzeiligen anderen Wörtern enthält, verwenden Sie -> get () oder -> all ()

  if($result->count()) {

         ...record is exist true...
  }

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.