it-swarm.com.de

Eloquent Collection: Leeren zählen und entdecken

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

Wir verwenden derzeit !$result, um ein leeres Ergebnis zu erkennen. Ist das ausreichend? Bezieht sich count($result) tatsächlich auf alle Fälle, einschließlich leerer Ergebnisse?

202
bitinn

Wenn Sie ->get() verwenden, können Sie keines der folgenden Elemente verwenden:

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

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

Um festzustellen, ob Ergebnisse vorliegen, haben Sie folgende Möglichkeiten:

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

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

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

Anmerkungen/Referenzen

Bonus Informationen

Die Unterschiede zwischen Collection und Query Builder können für Neulinge von Laravel etwas verwirrend sein, da die Methodennamen oft gleich sind. Aus diesem Grund kann es verwirrend sein zu wissen, woran Sie gerade arbeiten. Der Abfrage-Generator erstellt im Wesentlichen eine Abfrage, bis Sie eine Methode aufrufen, bei der die Abfrage ausgeführt und die Datenbank aufgerufen wird (z. B. beim Aufruf bestimmter Methoden wie ->all()->first()->lists() und anderen). Diese Methoden auch existieren im Collection-Objekt, das vom Query Builder zurückgegeben werden kann, wenn mehrere Ergebnisse vorliegen. Wenn Sie nicht sicher sind, mit welcher Klasse Sie tatsächlich arbeiten, versuchen Sie var_dump(User::all()) und experimentieren Sie, um herauszufinden, welche Klassen tatsächlich zurückgegeben werden (mithilfe von get_class(...)). Ich empfehle Ihnen dringend, den Quellcode für die Collection-Klasse auszulesen. Das ist ziemlich einfach. Dann checken Sie den Query Builder aus und sehen Sie die Ähnlichkeiten in den Funktionsnamen und finden Sie heraus, wann er tatsächlich auf die Datenbank trifft.

450
Gary Green

Ich denke, Sie suchen:

$result->isEmpty()

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

56
clod986

Ich stimme der oben genannten genehmigten Antwort zu. Normalerweise verwende ich jedoch die $results->isNotEmpty()-Methode wie unten angegeben.

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

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

Beachten Sie, dass diese Methode ab Version 5.3 existiert.

7
sathish R

Ich denke besser zu benutzen

$result->isEmpty();

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

2
Jignesh Joisar

In Laravel gibt es mehrere Methoden, um die Ergebniszählung 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.
2
Lovepreet Singh

Ich glaube du versuchst so etwas 

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

oder auch verwenden

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

Du kannst tun 

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

die Ergebnisse zählen. 

Sie können auch verwenden 

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

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

1
PatrickL

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

in diesem Fall möchten Sie zwei Arten der Zählung für zwei Schritte prüfen 

Fall 1:

wenn das Ergebnis nur einen Datensatz enthält, wählen Sie eine Zeile aus der Datenbank aus. Verwenden Sie dazu -> first ().

 if(count($result)){

       ...record is exist true...
  }

Fall 2:

wenn das Ergebnis mehrere Zeilen enthält, wird ein anderes Wort mit -> get () oder -> all () verwendet.

  if($result->count()) {

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

laravel gibt also tatsächlich eine Sammlung zurück, wenn Sie nur Model::all(); verwenden. Sie möchten keine Sammlung, die ein Array haben soll. Geben Sie set(array)Model::all(); ein. 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
}

dadurch können Sie auch Dinge wie count() ausführen.

0

Laut Laravel Documentation States können Sie diesen Weg verwenden: 

$result->isEmpty();

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

0
Udhav Sarvaiya