Gostaria de recuperar o último arquivo inserido na minha tabela. Eu sei que o método first()
existe e fornece o primeiro arquivo da tabela, mas não sei como obter a última inserção.
Gostaria de recuperar o último arquivo inserido na minha tabela. Eu sei que o método first()
existe e fornece o primeiro arquivo da tabela, mas não sei como obter a última inserção.
Respostas:
Você precisará solicitar pelo mesmo campo que está solicitando agora, mas descendente. Como exemplo, se você tiver um carimbo de data / hora quando o upload for chamado upload_time
, faça algo assim;
Para o Pré-Laravel 4
return DB::table('files')->order_by('upload_time', 'desc')->first();
Para o Laravel 4 em diante
return DB::table('files')->orderBy('upload_time', 'desc')->first();
Para o Laravel 5.7 e seguintes
return DB::table('files')->latest('upload_time')->first();
Isso ordenará as linhas na tabela de arquivos por tempo de upload, ordem decrescente e a primeira. Este será o último arquivo carregado.
orderBy
, nãoorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
ordem por data do Laravel 5.x funciona mais porque a data é string e provavelmente não indexada. Enquanto a chave primária é indexada e funciona super rápido. Mesmo se created_at indexado, é uma string indexada e não INT no caso de primário. A sequência de índice tem menos desempenho.
orderBy('created_at', 'desc')
não fornece a última linha. Exemplo: 3 linhas pode ter exatamente o mesmo valor TIMESTAMP e com orderBy('created_at', 'desc')
que você vai ter o primeiro dos 3 (que não é necessariamente a última linha)
Use o escopo mais recente fornecido pelo Laravel imediatamente.
Model::latest()->first();
Dessa forma, você não está recuperando todos os registros. Um atalho melhor para orderBy.
created_at
coluna gerada automaticamente ($timestamps = true)
no modelo, mas pode ser desabilitada quando desejar, para que você tenha um erro se indefinido
Você nunca mencionou se está usando o Eloquent, o ORM padrão do Laravel ou não. Caso seja, digamos que você queira obter a entrada mais recente de uma tabela de usuário, por created_at, você provavelmente poderá fazer o seguinte:
User::orderBy('created_at', 'desc')->first();
Primeiro, ele ordena os usuários pelo campo created_at, descendente, e depois pega o primeiro registro do resultado.
Isso retornará uma instância do objeto Usuário, não uma coleção. Obviamente, para fazer uso dessa alternativa, você precisa ter um modelo de usuário, estendendo a classe Eloquent. Isso pode parecer um pouco confuso, mas é realmente fácil começar e o ORM pode ser realmente útil.
Para mais informações, consulte a documentação oficial, que é bastante rica e bem detalhada.
Para obter os detalhes do último registro
Model::all()->last();
ouModel::orderBy('id', 'desc')->first();
Para obter o último ID do registro
Model::all()->last()->id;
ou Model::orderBy('id', 'desc')->first()->id;
As coleções do Laravel têm o método last
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
Essa é a melhor maneira de fazer isso.
all()
método realmente carrega todos os itens. Isso não funcionará em uma tabela com milhões de registros.
last()
retorna uma única instância Eloquent e não uma Collection, e a chamada pluck()
igual a chamada Model::all()->pluck('name')
, retornando, portanto, o name
atributo de todas as linhas da tabela
Tente o seguinte:
Model::latest()->get();
Você pode usar o escopo mais recente fornecido pelo Laravel com o campo que deseja filtrar, digamos que ele será ordenado por ID e, em seguida:
Model::latest('id')->first();
Dessa forma, você pode evitar pedidos por created_at
campo por padrão no Laravel.
Para obter os detalhes do último registro, use o código abaixo:
Model::where('field', 'value')->get()->last()
Outra maneira sofisticada de fazer isso no Laravel 6.x (incerto, mas deve funcionar também para o 5.x):
DB::table('your_table')->get()->last();
Você também pode acessar os campos:
DB::table('your_table')->get()->last()->id;
get()
método buscará tudo your_table
e gerará uma coleção e o last()
método obterá o último item dessa coleção. Portanto, você já terá todos os dados da tabela carregados na memória (incorretos). Você deve apenas usar `DB :: table ('items') -> latest () -> first ();` nos bastidores, ele executa `orderBy ($ column, 'desc')` e busca o primeiro registro.
Model($where)->get()->last()->id
Se você está procurando a linha real que você acabou de inserir com o Laravel 3 e 4 ao executar uma ação save
ou create
em um novo modelo como:
$user->save();
-ou-
$user = User::create(array('email' => 'example@gmail.com'));
a instância do modelo inserida será retornada e poderá ser usada para ações adicionais, como redirecionar para a página de perfil do usuário recém-criado.
Procurar o último registro inserido funciona no sistema de baixo volume funcionará quase o tempo todo, mas se você precisar inserir as inserções ao mesmo tempo, poderá acabar consultando para encontrar o registro errado. Isso pode realmente se tornar um problema em um sistema transacional em que várias tabelas precisam ser atualizadas.
De alguma forma, todas as opções acima parecem não funcionar para mim no laravel 5.3, então resolvi meu próprio problema usando:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
espero que seja capaz de salvar alguém.
estar ciente de que last()
, latest()
não são deterministas se você estiver procurando por um seqüencial ou evento / record ordenada. Os últimos / recentes registros podem ter exatamente o mesmo created_at
registro de data e hora, e o retorno é não determinístico. O mesmo acontece orderBy(id|foo)->first()
. Outras idéias / sugestões sobre como ser determinístico são bem-vindas.