Zählergebnis der Laravel-Sammlungen

Lesezeit: 4 Minuten

Benutzeravatar von Klaaz
Klaas

Wenn ich bei einem Benutzermodell (Tabelle mit 4 Datensätzen) Folgendes tue:

$coll = User::all();
echo $coll->count();

Ich erhalte die Anzahl der gefundenen Datensätze (4).

Aber wenn ich das mache:

$coll = User::find(2);
echo $coll->count();

Ich bekomme nicht 1 (wie erwartet), sondern die Anzahl der Attribute in der resultierenden Sammlung (in diesem Fall 23).

Wie kann ich überprüfen, ob mehr als ein Datensatz gefunden wurde?


AKTUALISIEREN:

OK, dank euch allen sehe ich jetzt den Unterschied im Ergebnis zwischen Sammlung und Modell.

Aber mein eigentliches Problem ist, dass ich erkennen muss, ob ich als Ergebnis ein Modell oder eine Sammlung habe. Abhängig von diesem Ergebnis nehme ich einige Änderungen am Inhalt der Felder in den Elementen (mit map()) oder model vor. Wie kann ich erkennen, ob das Ergebnis ein Modell oder eine Sammlung ist?

if(count($coll) > 1)

Funktioniert, aber ist das der richtige Ansatz?

  • Ich glaube nicht ::find() Gibt eigentlich eine Sammlung zurück.

    – Keine Panik

    11. Mai 2015 um 22:56 Uhr

  • @Don’tPanic Eigentlich kann es, wenn Sie ihm ein Array von IDs übergeben. Aber in diesem Fall, wenn der Eintrag mit einem id = 2 gefunden wird, wird ein Eloquent Model zurückgegeben.

    – Bogdan

    11. Mai 2015 um 22:57 Uhr


  • @Bogdan, guter Punkt. Ich glaube, ich hätte es genauer sagen sollen ::find(2) gibt keine Sammlung zurück.

    – Keine Panik

    11. Mai 2015 um 22:59 Uhr

Bogdans Benutzeravatar
Bogdan

Hier ist, was mit dem Code los ist, den Sie dort haben:

1. Beim Anrufen User::all() du bekommst ein Illuminate\Database\Eloquent\Collection auf dem Sie anrufen können count die die Elemente in der Sammlung wie folgt zählt:

public function count()
{
    return count($this->items);
}

Dadurch wird die Anzahl der Elemente in der Sammlung so zurückgegeben, wie Sie es korrekt erwartet haben.

2. Beim Anrufen User::find(2) Der Eloquent Query Builder gibt jedoch kein a zurück Collectionda überprüft wird, wie viele Ergebnisse es gibt und seit Sie bestanden haben ein Ausweis du bekommst höchstens ein Ergebnis, daher wird stattdessen ein Eloquent Model zurückgegeben. Das Modell hat keine count() Methode, also wenn Sie versuchen anzurufen $coll->count(); es wird zur Magie gehen __call Methode, die die Klasse implementiert hat und die so aussieht:

public function __call($method, $parameters)
{
    if (in_array($method, array('increment', 'decrement')))
    {
        return call_user_func_array(array($this, $method), $parameters);
    }

    $query = $this->newQuery();

    return call_user_func_array(array($query, $method), $parameters);
}

Wie Sie sehen können, versucht die Methode zu sehen, ob sie ein paar fest codierte Methoden aufrufen soll (increment Und decrement), die in diesem Fall natürlich nicht passen, weil $method = 'count'sodass weiterhin eine neue Abfrage erstellt wird, für die aufgerufen wird count Methode.

Unter dem Strich machen sowohl das erste als auch das zweite Codebeispiel dasselbe: Zählen aller Einträge in der users Tisch.

Und da, wie ich oben gezeigt habe, eine ID nicht mit mehr als einer Zeile übereinstimmen kann (da IDs eindeutig sind), ist die Antwort auf deine Frage ist, dass es keine Notwendigkeit oder Möglichkeit gibt, die Ergebnisse von zu zählen find(2)da es nur 0 sein kann (if null zurückgegeben wird) oder 1 (falls a Model ist zurück gekommen).


AKTUALISIEREN

Zuallererst können Sie für zukünftige Referenzen PHP verwenden get_class um den Klassennamen eines Objekts zu ermitteln oder get_parent_class um die Klasse zu bestimmen, die es erweitert. In Ihrem Fall die zweite Funktion get_parent_class könnte nützlich sein, um die Modellklasse zu bestimmen, da die User -Klasse erweitert eine abstrakte Modellklasse von Laravel.

Also, wenn Sie ein Modell haben get_class($coll) werde melden UserAber get_parent_class($coll) werde melden \Illuminate\Database\Eloquent\Model.

Überprüfen Sie nun, ob das Ergebnis eine Sammlung oder ein Modell ist, das Sie verwenden können instanceof:

instanceof wird verwendet, um festzustellen, ob eine PHP-Variable ein instanziiertes Objekt einer bestimmten Klasse ist

Ihre Kontrollen sollten in etwa so aussehen:

// Check if it's a Collection
if ($coll instanceof \Illuminate\Support\Collection)

// Check if it's a Model
if ($coll instanceof \Illuminate\Database\Eloquent\Model)

Vielleicht möchten Sie auch überprüfen, ob das Ergebnis ist nullseit find wird zurückkehren null wenn kein Eintrag mit der angegebenen ID gefunden wird:

if (is_null($coll))

  • Natürlich! Ich habe keinen Unterschied zwischen einer Sammlung und einem Modell gemacht. Danke, dass du das für mich geklärt hast! Bitte sehen Sie sich die aktualisierte Frage für die echte Lösung an, nach der ich suche.

    – Klaas

    12. Mai 2015 um 7:49 Uhr


  • @Klaaz Ich habe die Antwort mit der Lösung für Ihre aktualisierte Frage aktualisiert.

    – Bogdan

    12. Mai 2015 um 9:12 Uhr


  • Großartig! Das macht die Sache sehr klar, danke für die Erklärung 🙂

    – Klaas

    12. Mai 2015 um 10:36 Uhr

  • Der Collection hat seine eigene Methode $collection->count()

    – CodeToLife

    28. September 2022 um 15:41 Uhr

Es scheint, Sie erwarten die find()-Methode anders zu verhalten. Von dem Dokumente

Find a model by its primary key.

  • Laravel hat während einer Neugestaltung irgendwann viele Dokumentationslinks beschädigt, sodass diese alten API-Links tot sind.

    – kjones

    21. Juli 2021 um 20:10 Uhr

Wenn Sie das Problem haben, überprüfen Sie, ob es aus der Sammlung stammt. Warum überprüfen Sie nicht, ob es aus Illuminate\Database\Eloquent\Collection stammt.

if (get_class($coll) == 'Illuminate\Database\Eloquent\Collection') {
   your code...
}

oder

if ($coll instanceof \Illuminate\Database\Eloquent\Collection) {
   your code...
}

1444550cookie-checkZählergebnis der Laravel-Sammlungen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy