Qual è la differenza tra find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()


109

Qual è la differenza tra questi metodi:

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

Li ho usati e ognuno dà un risultato diverso ea volte devo aggiungere toArray()alla fine get()perché la mia funzione si aspetta un array. Anche gli altri metodi non produrranno array?



Tutte le informazioni di @Joseph Silber sono corrette e molto utili. Voglio aggiungere una risposta a list () Da Laravel 5.2 Il metodo list sugli oggetti Collection, Query Builder e Eloquent Query Builder è stato rinominato in pluck. La firma del metodo rimane la stessa.
Nirav Bhoi

Risposte:


227
  1. find($id)prende un id e restituisce un singolo modello. Se non esiste alcun modello corrispondente, restituisce null.

  2. findOrFail($id)prende un id e restituisce un singolo modello. Se non esiste alcun modello corrispondente, genera un errore 1 .

  3. first()restituisce il primo record trovato nel database. Se non esiste alcun modello corrispondente, restituisce null.

  4. firstOrFail()restituisce il primo record trovato nel database. Se non esiste alcun modello corrispondente, genera un errore 1 .

  5. get() restituisce una raccolta di modelli che corrispondono alla query.

  6. pluck($column)restituisce una raccolta dei soli valori nella colonna data. Nelle versioni precedenti di Laravel questo metodo era chiamato lists.

  7. toArray() converte il modello / collezione in un semplice array PHP.


Nota: una collezione è un array rinforzato. Funziona in modo simile a un array, ma ha molte funzionalità aggiuntive, come puoi vedere nei documenti .

Sfortunatamente, PHP non ti consente di utilizzare un oggetto di raccolta ovunque tu possa utilizzare un array. Ad esempio, usare una raccolta in un foreachciclo va bene, mettere il passaggio a array_mapnon lo è. Allo stesso modo, se digiti un suggerimento come argomento array, PHP non ti consentirà di passargli una raccolta. A partire da PHP 7.1, c'è il iterabletypehint , che può essere usato per accettare sia array che collezioni.

Se vuoi ottenere un semplice array da una raccolta, chiama il suo all()metodo.


1 L'errore generato dai metodi findOrFaile firstOrFailè un file ModelNotFoundException. Se non prendi tu stesso questa eccezione, Laravel risponderà con un 404 , che è quello che vuoi la maggior parte delle volte.


1
Grazie per il chiarimento. Ecco il punto, sto cercando di ottenere un elenco di post come questo in $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);modo da poter accedere $post->subreddit->moderators->user_idma questo è dare Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- posso accedere $post->subreddit->moderatorsma non quando ho aggiunto user_id- perché?
Halnex

subredditè un singolo modello, con una moderatorsproprietà. moderatorsè una collezione, non un singolo modello. Non puoi accedere a nulla direttamente da esso. Puoi controllare il primo se vuoi:$post->subreddit->moderators[0]->user_id
Joseph Silber

Penso che dovresti sostituire "genera un errore" con "genera un'eccezione ModelNotFoundException": D Comunque ottimo contributo;)
bobbybouwmann

@JosephSilber Perfect!
bobbybouwmann
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.