Comment puis-je sélectionner une ligne aléatoire en utilisant Eloquent ou Fluent dans le framework Laravel?
Je sais qu'en utilisant SQL, vous pouvez passer commande par RAND (). Cependant, je voudrais obtenir la ligne aléatoire sans compter le nombre d'enregistrements avant la requête initiale.
Des idées?
Réponses:
Laravel> = 5.2:
ou
ou pour obtenir le nombre spécifique d'enregistrements
Laravel 4.2.7 - 5.1:
Laravel 4.0 - 4.2.6:
Laravel 3:
Consultez cet article sur les lignes aléatoires MySQL. Laravel 5.2 prend en charge cela, pour les anciennes versions, il n'y a pas de meilleure solution que d'utiliser RAW Queries .
edit 1: Comme mentionné par Double Gras, orderBy () ne permet rien d'autre que ASC ou DESC depuis ce changement. J'ai mis à jour ma réponse en conséquence.
edit 2: Laravel 5.2 implémente enfin une fonction wrapper pour cela. Cela s'appelle inRandomOrder () .
la source
'RANDOM()'
Cela fonctionne très bien,
vous pouvez également modifier l'argument dans une fonction aléatoire pour obtenir plusieurs enregistrements.
Remarque: déconseillé si vous avez d'énormes données car cela récupérera toutes les lignes en premier, puis retournera une valeur aléatoire.
la source
tl; dr: Il est aujourd'hui implémenté dans Laravel, voir "edit 3" ci-dessous.
Malheureusement, à ce jour, la
->orderBy(DB::raw('RAND()'))
solution proposée comporte certaines mises en garde :RANDOM()
Pire encore, cette solution n'est plus applicable depuis ce changement :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edit: Maintenant, vous pouvez utiliser la méthode orderByRaw () :
->orderByRaw('RAND()')
. Cependant, ce n'est pas encore indépendant de la DB.FWIW, CodeIgniter implémente un
RANDOM
direction de tri , qui est remplacée par la grammaire correcte lors de la requête. Il semble également être assez facile à mettre en œuvre. On dirait que nous avons un candidat pour améliorer Laravel :)mise à jour: voici le problème à ce sujet sur GitHub, et ma demande de pull en attente .
edit 2: Coupons la chasse. Depuis Laravel 5.1.18, vous pouvez ajouter des macros au générateur de requêtes:
Usage:
edit 3: Enfin! Depuis Laravel 5.2.33 ( changelog , PR # 13642 ), vous pouvez utiliser la méthode native
inRandomOrder()
:la source
Dans Laravel 4 et 5, le
order_by
est remplacé parorderBy
Donc, ça devrait être:
la source
Vous pouvez utiliser :
la source
Pour Laravel 5.2> =
utilisez la méthode Eloquent:
La méthode inRandomOrder peut être utilisée pour trier les résultats de la requête de manière aléatoire. Par exemple, vous pouvez utiliser cette méthode pour récupérer un utilisateur aléatoire:
depuis les documents: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
la source
Vous pouvez également utiliser la méthode order_by avec fluent et éloquent comme:
C'est un peu bizarre, mais ça marche.
Edit: Comme l'a dit @Alex, cette utilisation est plus propre et fonctionne également:
la source
Utiliser la fonction Laravel
la source
Vous pouvez facilement utiliser cette commande:
// Question: nom du modèle
// prendre 10 lignes de la base de données dans les enregistrements aléatoires ...
la source
Je préfère spécifier d'abord ou échouer:
la source
Laravel a une méthode intégrée pour mélanger l'ordre des résultats.
Voici une citation de la documentation:
La méthode aléatoire mélange les éléments de la collection de manière aléatoire:
Vous pouvez voir la documentation ici .
la source
Sur votre modèle, ajoutez ceci:
puis route / contrôleur
la source
Il y a aussi
whereRaw('RAND()')
qui fait de même, vous pouvez ensuite enchaîner->get()
ou->first()
ou même devenir fou et ajouter->paginate(int)
.la source
J'ai une table avec des milliers d'enregistrements, j'ai donc besoin de quelque chose de rapide. Voici mon code pour la ligne pseudo aléatoire:
la source
$count
seulement la première d'entre elles serait récupérée, et donc il serait également plus susceptible d'être récupéré que toute autre ligne.