Was ist der Unterschied zwischen find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()

96

Was ist der Unterschied zwischen diesen Methoden:

  1. find()
  2. findOrFail()
  3. first()
  4. firstOrFail()
  5. get()
  6. list()
  7. toArray()

Ich habe sie verwendet und jeder liefert ein anderes Ergebnis und manchmal muss ich toArray()am Ende hinzufügen, get()weil meine Funktion ein Array erwartet. Werden die anderen Methoden nicht auch Arrays erzeugen?

Halnex
quelle
1
Schauen Sie sich die Query Builder-Dokumente sowie die Eloquent API-Referenz an .
Stuart Wagner
Alle Informationen von @Joseph Silber sind korrekt und sehr nützlich. Ich möchte list () eine Antwort hinzufügen. Aus Laravel 5.2 Die Listenmethode für die Objekte Collection, Query Builder und Eloquent Query Builder wurde in Zupfen umbenannt. Die Methodensignatur bleibt gleich.
Nirav Bhoi

Antworten:

210
  1. find($id)Nimmt eine ID und gibt ein einzelnes Modell zurück. Wenn kein übereinstimmendes Modell vorhanden ist, wird es zurückgegeben null.

  2. findOrFail($id)Nimmt eine ID und gibt ein einzelnes Modell zurück. Wenn kein übereinstimmendes Modell vorhanden ist, wird der Fehler 1 ausgegeben .

  3. first()Gibt den ersten in der Datenbank gefundenen Datensatz zurück. Wenn kein übereinstimmendes Modell vorhanden ist, wird es zurückgegeben null.

  4. firstOrFail()Gibt den ersten in der Datenbank gefundenen Datensatz zurück. Wenn kein übereinstimmendes Modell vorhanden ist, wird der Fehler 1 ausgegeben .

  5. get() Gibt eine Sammlung von Modellen zurück, die der Abfrage entsprechen.

  6. pluck($column)Gibt eine Sammlung nur der Werte in der angegebenen Spalte zurück. In früheren Versionen von Laravel wurde diese Methode aufgerufen lists.

  7. toArray() konvertiert das Modell / die Sammlung in ein einfaches PHP-Array.


Hinweis: Eine Sammlung ist ein verbessertes Array. Es funktioniert ähnlich wie ein Array, verfügt jedoch über zahlreiche zusätzliche Funktionen, wie Sie in den Dokumenten sehen können .

Leider können Sie mit PHP nicht überall ein Sammlungsobjekt verwenden, wo Sie ein Array verwenden können. Die Verwendung einer Sammlung in einer foreachSchleife ist beispielsweise in Ordnung. Übergeben Sie sie anarray_map nicht. Wenn Sie ein Argument als arrayangeben, lässt PHP nicht zu, dass Sie ihm eine Sammlung übergeben. Ab PHP 7.1 gibt es den iterableTypehint , mit dem sowohl Arrays als auch Sammlungen akzeptiert werden können.

Wenn Sie jemals ein einfaches Array aus einer Sammlung abrufen möchten, rufen Sie dessen all()Methode auf.


1 Der von den Methoden findOrFailund ausgelöste Fehler firstOrFailist a ModelNotFoundException. Wenn Sie diese Ausnahme nicht selbst abfangen, antwortet Laravel mit einem 404 , was Sie die meiste Zeit wollen.

Joseph Silber
quelle
1
Vielen Dank für die Aufklärung. Hier ist die Sache, ich versuche, eine Liste von Posts wie diesen zu bekommen, $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);damit ich darauf zugreifen kann, $post->subreddit->moderators->user_idaber das gibt Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- ich kann zugreifen, $post->subreddit->moderatorsaber nicht, wenn ich hinzufüge user_id- warum ist das so?
Halnex
subredditist ein einzelnes Modell mit einer moderatorsEigenschaft. moderatorsist eine Sammlung, kein einzelnes Modell. Sie können nicht direkt darauf zugreifen. Sie können den ersten überprüfen, wenn Sie möchten:$post->subreddit->moderators[0]->user_id
Joseph Silber
Ich denke, Sie sollten "es wirft einen Fehler" durch "es löst eine ModelNotFoundException-Ausnahme aus" ersetzen: D Wie auch immer, großer Beitrag;)
bobbybouwmann
@ JosephSilber Perfekt!
Bobbybouwmann