Jaka jest różnica między tymi metodami:
find()
findOrFail()
first()
firstOrFail()
get()
list()
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?
Odpowiedzi:
find($id)
pobiera identyfikator i zwraca pojedynczy model. Jeśli nie istnieje pasujący model, zwracanull
.findOrFail($id)
pobiera identyfikator i zwraca pojedynczy model. Jeśli nie istnieje pasujący model, zgłasza błąd 1 .first()
zwraca pierwszy rekord znaleziony w bazie danych. Jeśli nie istnieje pasujący model, zwracanull
.firstOrFail()
zwraca pierwszy rekord znaleziony w bazie danych. Jeśli nie istnieje pasujący model, zgłasza błąd 1 .get()
zwraca kolekcję modeli pasujących do zapytania.pluck($column)
zwraca zbiór samych wartości z danej kolumny. W poprzednich wersjach Laravel ta metoda była nazywanalists
.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
foreach
pętli jest w porządku, przekazanie jej doarray_map
nie jest. Podobnie, jeśli wpiszesz podpowiedź argumentu jakoarray
, PHP nie pozwoli Ci przekazać mu kolekcji. Począwszy od PHP 7.1 dostępna jestiterable
wskazó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
findOrFail
ifirstOrFail
toModelNotFoundException
. Jeśli sam nie złapiesz tego wyjątku, Laravel odpowie 404 , co jest tym, czego potrzebujesz przez większość czasu.źródło
$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);
aby mieć do nich dostęp,$post->subreddit->moderators->user_id
ale to dajeUndefined property: Illuminate\Database\Eloquent\Collection::$user_id
- mam dostęp,$post->subreddit->moderators
ale nie po dodaniuuser_id
- dlaczego tak jest?subreddit
to pojedynczy model zmoderators
właściwością.moderators
to 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