Qual é a diferença entre find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()

98

Qual é a diferença entre esses métodos:

  1. find()
  2. findOrFail()
  3. first()
  4. firstOrFail()
  5. get()
  6. list()
  7. 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?

Halnex
fonte
1
Dê uma olhada na documentação do Query Builder , bem como na referência da API do Eloquent .
Stuart Wagner,
Todas as informações do @Joseph Silber são corretas e muito úteis. Eu quero adicionar uma resposta a list () do Laravel 5.2. O método list nos objetos Collection, query builder e Eloquent query builder foram renomeados para pluck. A assinatura do método permanece a mesma.
Nirav Bhoi

Respostas:

213
  1. find($id)pega um id e retorna um único modelo. Se nenhum modelo correspondente existir, ele retornará null.

  2. findOrFail($id)pega um id e retorna um único modelo. Se nenhum modelo correspondente existir, ele gerará um erro 1 .

  3. first()retorna o primeiro registro encontrado no banco de dados. Se nenhum modelo correspondente existir, ele retornará null.

  4. firstOrFail()retorna o primeiro registro encontrado no banco de dados. Se nenhum modelo correspondente existir, ele gerará um erro 1 .

  5. get() retorna uma coleção de modelos que correspondem à consulta.

  6. pluck($column)retorna uma coleção de apenas os valores na coluna fornecida. Nas versões anteriores do Laravel, este método era chamado lists.

  7. 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 foreachloop está ok, mas transmiti-la array_mapnão é. Similarmente, se você digitar um argumento como array, o PHP não deixará você passar uma coleção. A partir do PHP 7.1, existe o iterabletypehint , 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 findOrFaile firstOrFailé a ModelNotFoundException. Se você não detectar essa exceção, o Laravel responderá com um 404 , que é o que você deseja na maioria das vezes.

Joseph Silber
fonte
1
Obrigado pelo esclarecimento. É o seguinte, estou tentando obter uma lista de postagens como essa $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);para que eu possa acessar, $post->subreddit->moderators->user_idmas isso está dando Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- posso acessar, $post->subreddit->moderatorsmas não quando adicionei user_id- por que isso?
Halnex
subreddité um modelo único, com uma moderatorspropriedade. 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
Joseph Silber
Eu acho que você deve substituir "ele lança um erro" por "ele lança uma exceção ModelNotFoundException": D De qualquer forma, grande contribuição;)
bobbybouwmann
@JosephSilber Perfect!
bobbybouwmann