Como posso selecionar uma linha aleatória usando o Eloquent ou Fluent no framework Laravel?
Eu sei que usando o SQL, você pode fazer o pedido por RAND (). No entanto, gostaria de obter a linha aleatória sem contar o número de registros anteriores à consulta inicial.
Alguma ideia?
Respostas:
Laravel> = 5.2:
ou
ou para obter o número específico de registros
Laravel 4.2.7 - 5.1:
Laravel 4.0 - 4.2.6:
Laravel 3:
Verifique este artigo nas linhas aleatórias do MySQL. O Laravel 5.2 suporta isso; para a versão mais antiga, não há solução melhor do que usar as consultas RAW .
edit 1: Como mencionado por Double Gras, orderBy () não permite mais nada que ASC ou DESC desde essa alteração. Eu atualizei minha resposta de acordo.
edit 2: O Laravel 5.2 finalmente implementa uma função de wrapper para isso. É chamado inRandomOrder () .
fonte
'RANDOM()'
Isso funciona muito bem,
você também pode alterar o argumento na função aleatória para obter mais de um registro.
Nota: não recomendado se você tiver dados enormes, pois isso buscará todas as linhas primeiro e depois retornará valor aleatório.
fonte
tl; dr: Atualmente é implementado no Laravel, veja "edit 3" abaixo.
Infelizmente, a partir de hoje existem algumas advertências com a
->orderBy(DB::raw('RAND()'))
solução proposta:RANDOM()
Pior ainda, esta solução não é mais aplicável desde essa alteração :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edit: Agora você pode usar o orderByRaw () método:
->orderByRaw('RAND()')
. No entanto, isso ainda não é agnóstico ao DB.FWIW, CodeIgniter implementa uma
RANDOM
direção de classificação especial , que é substituída pela gramática correta ao criar a consulta. Também parece ser bastante fácil de implementar. Parece que temos um candidato para melhorar o Laravel :)update: aqui está o problema sobre isso no GitHub e minha solicitação de recebimento pendente .
edit 2: Vamos direto ao assunto. Desde o Laravel 5.1.18, você pode adicionar macros ao construtor de consultas:
Uso:
edit 3: Finalmente! Desde o Laravel 5.2.33 ( changelog , PR # 13642 ), você pode usar o método nativo
inRandomOrder()
:fonte
Em Laravel 4 e 5 o
order_by
é substituído pororderBy
Então, deve ser:
fonte
Você pode usar :
fonte
Para o Laravel 5.2> =
use o método Eloquent:
O método inRandomOrder pode ser usado para classificar os resultados da consulta aleatoriamente. Por exemplo, você pode usar este método para buscar um usuário aleatório:
de docs: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
fonte
Você também pode usar o método order_by com fluente e eloquente, como:
Este é um uso um pouco estranho, mas funciona.
Edit: Como o @Alex disse, esse uso é mais limpo e também funciona:
fonte
Use a função Laravel
fonte
Você pode facilmente usar este comando:
// Pergunta: nome do modelo
// obtém 10 linhas do DB In shuffle records ...
fonte
Prefiro especificar primeiro ou falhar:
fonte
O Laravel possui um método interno para embaralhar a ordem dos resultados.
Aqui está uma citação da documentação:
O método aleatório embaralha aleatoriamente os itens da coleção:
Você pode ver a documentação aqui .
fonte
No seu modelo, adicione isto:
depois na rota / controlador
fonte
Há também
whereRaw('RAND()')
que faz o mesmo, você pode, então, cadeia->get()
ou->first()
ou até mesmo ir louco e adicionar->paginate(int)
.fonte
Eu tenho uma tabela com milhares de registros, então preciso de algo rápido. Este é o meu código para linha pseudo-aleatória:
fonte
$count
apenas a primeira delas, elas serão recuperadas e, portanto, será mais provável que elas sejam recuperadas do que qualquer outra linha.