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?

Bitinn
quelle

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.

Gary Green
quelle
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

clod986
quelle
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.

sathish R.
quelle
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.
Lovepreet Singh
quelle
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.

Jignesh Joisar
quelle
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) { } 
pardeep
quelle
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.

Patrick Lumenus
quelle
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.

Udhav Sarvaiya
quelle
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().

Benjamin Sweetnam
quelle
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...
  }
Ravindra Bhanderi
quelle
0

Sie können verwenden: $counter = count($datas);

nazmulhaqued
quelle