Jaka jest różnica między find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()

115

Jaka jest różnica między tymi metodami:

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

Używałem ich i każdy z nich daje inny wynik i czasami muszę dodać toArray()na końcu, get()ponieważ moja funkcja oczekuje tablicy. Czy inne metody nie utworzą również tablic?

Halnex
źródło
1
Zapoznaj się z dokumentacją Query Builder , a także z materiałami referencyjnymi Eloquent API .
Stuart Wagner
Wszystkie informacje od @Joseph Silber są poprawne i bardzo przydatne. Chcę dodać odpowiedź do list () Z Laravel 5.2 Metoda list w obiektach Collection, kreator zapytań i elokwentny konstruktor zapytań została zmieniona na pluck. Podpis metody pozostaje taki sam.
Nirav Bhoi

Odpowiedzi:

242
  1. find($id)pobiera identyfikator i zwraca pojedynczy model. Jeśli nie istnieje pasujący model, zwraca null.

  2. findOrFail($id)pobiera identyfikator i zwraca pojedynczy model. Jeśli nie istnieje pasujący model, zgłasza błąd 1 .

  3. first()zwraca pierwszy rekord znaleziony w bazie danych. Jeśli nie istnieje pasujący model, zwraca null.

  4. firstOrFail()zwraca pierwszy rekord znaleziony w bazie danych. Jeśli nie istnieje pasujący model, zgłasza błąd 1 .

  5. get() zwraca kolekcję modeli pasujących do zapytania.

  6. pluck($column)zwraca zbiór samych wartości z danej kolumny. W poprzednich wersjach Laravel ta metoda była nazywana lists.

  7. toArray() konwertuje model / kolekcję na prostą tablicę PHP.


Uwaga: kolekcja to wzmocniona tablica. Działa podobnie do tablicy, ale ma wiele dodatkowych funkcji, jak widać w dokumentacji .

Niestety, PHP nie pozwala na użycie obiektu kolekcji wszędzie tam, gdzie można użyć tablicy. Na przykład użycie kolekcji w foreachpętli jest w porządku, przekazanie jej do array_mapnie jest. Podobnie, jeśli wpiszesz podpowiedź argumentu jako array, PHP nie pozwoli Ci przekazać mu kolekcji. Począwszy od PHP 7.1 dostępna jest iterablewskazówka , której można używać do akceptowania zarówno tablic, jak i kolekcji.

Jeśli kiedykolwiek zechcesz pobrać zwykłą tablicę z kolekcji, wywołaj jej all()metodę.


1 Błąd zgłaszany przez metody findOrFaili firstOrFailto ModelNotFoundException. Jeśli sam nie złapiesz tego wyjątku, Laravel odpowie 404 , co jest tym, czego potrzebujesz przez większość czasu.

Joseph Silber
źródło
1
Dziękuję za wyjaśnienie. Chodzi o to, że próbuję uzyskać listę takich postów, $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);aby mieć do nich dostęp, $post->subreddit->moderators->user_idale to daje Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- mam dostęp, $post->subreddit->moderatorsale nie po dodaniu user_id- dlaczego tak jest?
Halnex
subredditto pojedynczy model z moderatorswłaściwością. moderatorsto kolekcja, a nie pojedynczy model. Nie możesz uzyskać dostępu do niczego bezpośrednio z tego. Możesz sprawdzić pierwszą, jeśli chcesz:$post->subreddit->moderators[0]->user_id
Joseph Silber
Myślę, że należy zamienić "to zgłasza błąd" na "wyrzuca wyjątek ModelNotFoundException": D W każdym razie świetny wkład;)
bobbybouwmann
@JosephSilber Perfect!
bobbybouwmann
Masz na myśli „instancję”, a nie „model”. Model jest strukturą koncepcyjną lub przykładem, a nie rzeczywistym wystąpieniem. Wyjaśnijmy sobie naszą terminologię. Niestety w świecie elokwentnym ludzie używają tych dwóch terminów zamiennie. Instancja nie jest modelem. Instancja to rzeczywista implementacja (wersja obiektu) modelu.
GeneC