8768 sujets

Développement web côté serveur, CMS

Pages :
Bonsoir à tous,

J'aimerais savoir s'il y a une manière de sélectionner un certain nombre de lignes de manière aléatoire dans une table? j'ai essayé avec un createQuery mais visiblement symfony a du mal avec RAND() (et avec d'autres fonctions SQL d'ailleurs )

Merci pour vos pistes
linapham a écrit :
I would like to thank you for the efforts you had made for writing this awesome article



U are welcome dear Smiley smile
moko a écrit :
Bonsoir à tous,

J'aimerais savoir s'il y a une manière de sélectionner un certain nombre de lignes de manière aléatoire dans une table? j'ai essayé avec un createQuery mais visiblement symfony a du mal avec RAND() (et avec d'autres fonctions SQL d'ailleurs )

Merci pour vos pistes


comment ça RAND() fonctionne mal avec SF ? peux-tu détailler ?
JENCAL a écrit :


comment ça RAND() fonctionne mal avec SF ? peux-tu détailler ?


Visiblement non : Error: Expected known function, got 'rand'

voici ma query :

$entityManager = $this->getEntityManager();
        $query = $entityManager->createQuery(
            "SELECT q  FROM App\Entity\Question q order by rand() LIMIT 3 ");
        $result= $query->execute();
        
Bonjour,

Tu peux utiliser le Bundle DoctrineExtension qui ajoute le support des fonctions SQL non prises en charge nativement par Doctrine:
https://github.com/beberlei/DoctrineExtensions

Je l'utilise dans mes QueryBuilder et ça fonctionne nickel.

Tu dois juste ajouter ceci à ta conf doctrine, pour ajouter le support de RAND:
# Doctrine Configuration
doctrine:
    orm:
        dql:
            numeric_functions:
                rand: DoctrineExtensions\Query\Mysql\Rand
Oui en effet, pas mal de fonctions natives de MySQL non supportée par Doctrine.
C'est pour ça qu'il faut rapidement se tourner vers ce type de Bundle, ou implémenter ses propres fonctions DQL (mais ce bundle le fait très bien donc bon...).
Raphi a écrit :
Bonjour,

Tu peux utiliser le Bundle DoctrineExtension qui ajoute le support des fonctions SQL non prises en charge nativement par Doctrine:
https://github.com/beberlei/DoctrineExtensions

Je l'utilise dans mes QueryBuilder et ça fonctionne nickel.

Tu dois juste ajouter ceci à ta conf doctrine, pour ajouter le support de RAND:
# Doctrine Configuration
doctrine:
    orm:
        dql:
            numeric_functions:
                rand: DoctrineExtensions\Query\Mysql\Rand


Super.. J'avais require ce bundle mais je n'avais pas ajouté la function dans la config Smiley lol
JENCAL a écrit :
ah oué.... doctrine c'est bien mais y'a quelques limites quand même Smiley decu


Tu comprends pourquoi je galère Smiley biggrin Smiley biggrin
moko a écrit :


Tu comprends pourquoi je galère Smiley biggrin Smiley biggrin


oué, mais perso, j'aurais utilisé le random de php et je l'aurais envoyé en param...
JENCAL a écrit :


oué, mais perso, j'aurais utilisé le random de php et je l'aurais envoyé en param...

Pour le Random, c'est sur que PHP peut faire l'affaire, mais ça fait un traitement de supplémentaire.
Par contre pour d'autre type de fonction SQL, c'est super utile de le faire directement et de ne pas avoir à retraiter derrière en PHP.
Raphi a écrit :

Pour le Random, c'est sur que PHP peut faire l'affaire, mais ça fait un traitement de supplémentaire.
Par contre pour d'autre type de fonction SQL, c'est super utile de le faire directement et de ne pas avoir à retraiter derrière en PHP.


et oui carrement... comme le datediff Smiley smile
Raphi a écrit :
Bonjour,

Tu peux utiliser le Bundle DoctrineExtension qui ajoute le support des fonctions SQL non prises en charge nativement par Doctrine:
https://github.com/beberlei/DoctrineExtensions

Je l'utilise dans mes QueryBuilder et ça fonctionne nickel.

Tu dois juste ajouter ceci à ta conf doctrine, pour ajouter le support de RAND:
# Doctrine Configuration
doctrine:
    orm:
        dql:
            numeric_functions:
                rand: DoctrineExtensions\Query\Mysql\Rand


Bon j'ai ajouté cette extension dans le doctrine.yaml mais je continue à avoir une erreur (Error: Expected end of string, got 'RAND') Smiley fache

J'ai rajouté ORDER BY (je l'avais enlevé entre temps) .. maintenant c'est avec LIMIT qu'il y a un probleme (Error: Expected end of string, got 'LIMIT')
Modifié par moko (28 May 2019 - 15:40)
Raphi a écrit :
Et si tu utilises RAND() au lieu de rand() ?


Oui tout est en majuscule
Pour LIMIT normalement il faut passer par la fonction setMaxResults() comme ceci:
$query = $entityManager
    ->createQuery("SELECT q FROM App\Entity\Question q ORDER BY RAND()")
    ->setMaxResults(3)
;

Modifié par Raphi (28 May 2019 - 15:49)
Meilleure solution
Pages :