Symfony 2 / doctrine : order by "expression" ?

ViPHP
ViPHP | 3607 Messages

26 janv. 2016, 23:07

Bonsoir à tous,

Voilà trois heures que je tente une manoeuvre de haute voltige en SQL via symfony2/doctrine :

Code : Tout sélectionner

SELECT mi.* FROM menu_item mi ORDER BY (mi.parent IS NULL) DESC
Impressionnant n'est-ce pas ? :-°

je précise que la requête finale est un poil plus compliquée : il y a deux order :
ORDER BY
(mi.parent IS NULL) DESC,
mi.parent ASC
D'où mon "obligation" d'utiliser cette "expression" dans le order by.

Bon trêve de plaisanterie... Je ne parviens pas du tout à mes fins...
J'ai testé différentes choses :

QueryBuilder :
$queryBuilder = $this->createQueryBuilder('mi');

        $query = $queryBuilder
            ->addSelect('(mi.parent IS NULL) as parent_is_null')
            ->orderBy('parent_is_null','DESC')
            ->getQuery();
j'ai des erreurs de "parsing" de doctrine...
DQL :
$query = $em->createQuery(
            'SELECT
                mi
            FROM
                MyBundle:MenuItem mi
            ORDER BY
              (mi.parent IS NULL) DESC'
        );
Idem erreur de parsing.

Je tente même en "NativeQuery":
$rsm = new ResultSetMapping();
$query = $this->getEntityManager()->createNativeQuery(
            'SELECT
                mi.*
            FROM
                menu_item mi
            ORDER BY
              (mi.parent IS NULL) DESC',
            $rsm
        );
var_dump($query->getResult());
Je n'ai pas d'erreurs, si je test la requête (via $query->getSQL()) directement dans mysql, ça fonctionne.
Mais là je n'ai aucun résultat...

Je ne trouve rien de fonctionnel sur le net, et les documentations sont bien maigres je trouve pour un point "poussé" comme ça....

Si quelqu'un à la solution... :)

Merci d'avance pour votre aide,

Cordialement,

ViPHP
ViPHP | 928 Messages

26 janv. 2016, 23:38

Salut,

Je t'avoue que je n'avais jamais vu cette syntaxe en 15 ans de dev, j'étais peut être passé à côté mais ce n'est quand même pas beaucoup utilisé, j'aurai plutôt mis le "mi.parent IS NULL" dans le SELECT. Par contre ça ne marche pas non plus en DQL :p

Tu dois pouvoir faire ça avec les nativeQuery, elles sont là pour ça, mais n'en ayant jamais utilisé pour l'instant je ne peux pas te filer la syntaxe exacte, il ne te reste plus qu'à potasser la documentation.

Plutôt que de perdre trop de temps là dessus, fait le tri en PHP. Vu qu'il s'agit d'un menu, je ne pense qu'il y ait des milliers d'entrées non plus.

++

ViPHP
ViPHP | 3607 Messages

26 janv. 2016, 23:54

Bonsoir Genova,

J'aurais bien voulu mettre l'"expression" dans le select..
Mais je n'y suis pas parvenu jusque là...

Bon j'ai entre temps trouvé des exemples plus parlant pour le "nativeQuery" (mais pas sur la doc de doctrine... allez savoir...)

Donc j'ai trouvé ça : http://sf2.memosdedev.com/creer-une-req ... rine2.html
Et effectivement sur la doc : http://doctrine-orm.readthedocs.org/pro ... uery-class
il y a un énigmatique "Build RSM here"...

merci pour ta réponse en tout cas,