Qual é a diferença entre esses métodos:
find()
findOrFail()
first()
firstOrFail()
get()
list()
toArray()
Tenho usado eles e cada um dá um resultado diferente e às vezes preciso adicionar toArray()
no final de get()
porque minha função está esperando um array. Os outros métodos também não produzirão matrizes?
Respostas:
find($id)
pega um id e retorna um único modelo. Se nenhum modelo correspondente existir, ele retornaránull
.findOrFail($id)
pega um id e retorna um único modelo. Se nenhum modelo correspondente existir, ele gerará um erro 1 .first()
retorna o primeiro registro encontrado no banco de dados. Se nenhum modelo correspondente existir, ele retornaránull
.firstOrFail()
retorna o primeiro registro encontrado no banco de dados. Se nenhum modelo correspondente existir, ele gerará um erro 1 .get()
retorna uma coleção de modelos que correspondem à consulta.pluck($column)
retorna uma coleção de apenas os valores na coluna fornecida. Nas versões anteriores do Laravel, este método era chamadolists
.toArray()
converte o modelo / coleção em um array PHP simples.Nota: uma coleção é uma matriz reforçada. Ele funciona de forma semelhante a uma matriz, mas tem muitas funcionalidades adicionais, como você pode ver nos documentos .
Infelizmente, o PHP não permite que você use um objeto de coleção em qualquer lugar em que possa usar um array. Por exemplo, usar uma coleção em um
foreach
loop está ok, mas transmiti-laarray_map
não é. Similarmente, se você digitar um argumento comoarray
, o PHP não deixará você passar uma coleção. A partir do PHP 7.1, existe oiterable
typehint , que pode ser usado para aceitar arrays e coleções.Se você quiser obter um array simples de uma coleção, chame seu
all()
método.1 O erro lançado pelos métodos
findOrFail
efirstOrFail
é aModelNotFoundException
. Se você não detectar essa exceção, o Laravel responderá com um 404 , que é o que você deseja na maioria das vezes.fonte
$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);
para que eu possa acessar,$post->subreddit->moderators->user_id
mas isso está dandoUndefined property: Illuminate\Database\Eloquent\Collection::$user_id
- posso acessar,$post->subreddit->moderators
mas não quando adicioneiuser_id
- por que isso?subreddit
é um modelo único, com umamoderators
propriedade.moderators
é uma coleção, não um único modelo. Você não pode acessar nada diretamente dele. Você pode verificar o primeiro se quiser:$post->subreddit->moderators[0]->user_id