¿Cuál es la diferencia entre find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()

109

¿Cuál es la diferencia entre estos métodos?

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

Los he estado usando y cada uno da un resultado diferente y, a veces, necesito agregar toArray()al final get()porque mi función espera una matriz. ¿No producirán los otros métodos también matrices?

Halnex
fuente
1
Eche un vistazo a los documentos de Query Builder , así como a la referencia de la API de Eloquent .
Stuart Wagner
Toda la información de @Joseph Silber es correcta y muy útil. Quiero agregar una respuesta a list () De Laravel 5.2 El método de lista en los objetos Collection, query builder y Eloquent query builder se ha renombrado a pluck. La firma del método sigue siendo la misma.
Nirav Bhoi

Respuestas:

227
  1. find($id)toma una identificación y devuelve un solo modelo. Si no existe un modelo coincidente, regresa null.

  2. findOrFail($id)toma una identificación y devuelve un solo modelo. Si no existe un modelo coincidente, arroja un error 1 .

  3. first()devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, regresa null.

  4. firstOrFail()devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error 1 .

  5. get() devuelve una colección de modelos que coinciden con la consulta.

  6. pluck($column)devuelve una colección de solo los valores en la columna dada. En versiones anteriores de Laravel se llamaba a este método lists.

  7. toArray() convierte el modelo / colección en una matriz PHP simple.


Nota: una colección es una matriz reforzada. Funciona de manera similar a una matriz, pero tiene muchas funciones adicionales, como puede ver en los documentos .

Desafortunadamente, PHP no le permite usar un objeto de colección en cualquier lugar donde pueda usar una matriz. Por ejemplo, usar una colección en un foreachbucle está bien, pasarla a array_mapno lo es. De manera similar, si escribe-insinúa un argumento como array, PHP no le permitirá pasarle una colección. A partir de PHP 7.1, existe la iterablesugerencia de tipo , que se puede utilizar para aceptar matrices y colecciones.

Si alguna vez desea obtener una matriz simple de una colección, llame a su all()método.


1 El error generado por los métodos findOrFaily firstOrFailes a ModelNotFoundException. Si no detecta esta excepción usted mismo, Laravel responderá con un 404 , que es lo que desea la mayor parte del tiempo.

Joseph Silber
fuente
1
Gracias por aclarar. Aquí está la cosa, estoy tratando de obtener una lista de publicaciones como esta $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);para poder acceder, $post->subreddit->moderators->user_idpero eso es dar Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- puedo acceder $post->subreddit->moderatorspero no cuando agregué user_id- ¿por qué?
Halnex
subredditEs un modelo único, con una moderatorspropiedad. moderatorses una colección, no un solo modelo. No puede acceder a nada directamente desde él. Puedes marcar el primero si quieres:$post->subreddit->moderators[0]->user_id
Joseph Silber
Creo que debería reemplazar "arroja un error" por "arroja una excepción ModelNotFoundException": D De todos modos, gran contribución;)
bobbybouwmann
@JosephSilber ¡Perfecto!
bobbybouwmann