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?
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 Collection
da ü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 User
Aber 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 null
seit find
wird zurückkehren null
wenn kein Eintrag mit der angegebenen ID gefunden wird:
if (is_null($coll))
Es scheint, Sie erwarten die find()-Methode anders zu verhalten. Von dem Dokumente
Find a model by its primary key.
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...
}
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