¿Cuál es la diferencia entre estos métodos?
find()
findOrFail()
first()
firstOrFail()
get()
list()
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?
Respuestas:
find($id)
toma una identificación y devuelve un solo modelo. Si no existe un modelo coincidente, regresanull
.findOrFail($id)
toma una identificación y devuelve un solo modelo. Si no existe un modelo coincidente, arroja un error 1 .first()
devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, regresanull
.firstOrFail()
devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error 1 .get()
devuelve una colección de modelos que coinciden con la consulta.pluck($column)
devuelve una colección de solo los valores en la columna dada. En versiones anteriores de Laravel se llamaba a este métodolists
.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
foreach
bucle está bien, pasarla aarray_map
no lo es. De manera similar, si escribe-insinúa un argumento comoarray
, PHP no le permitirá pasarle una colección. A partir de PHP 7.1, existe laiterable
sugerencia 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
findOrFail
yfirstOrFail
es aModelNotFoundException
. Si no detecta esta excepción usted mismo, Laravel responderá con un 404 , que es lo que desea la mayor parte del tiempo.fuente
$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);
para poder acceder,$post->subreddit->moderators->user_id
pero eso es darUndefined property: Illuminate\Database\Eloquent\Collection::$user_id
- puedo acceder$post->subreddit->moderators
pero no cuando agreguéuser_id
- ¿por qué?subreddit
Es un modelo único, con unamoderators
propiedad.moderators
es 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