2013-03-05 2 views
1

Je me sers de Symfony2 et de la doctrine 2, et j'ai un problème avec cette requête:DOCTRINE: Commande IN commandée?

$query = $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)'); 
    $result = $query->getArrayResult(); 

Et je reçois toujours l'ordre des résultats par a.id, soit 1 puis 4 puis 12 pendant que je voudrais afficher la résultats ordonnés que la liste des ids: 4 puis 12 puis 1.

MISE à JOUR Merci à @Bram Gerritsent commentaire, j'enregistrer une fonction DQL personnalisée FIELD, alors voici ce que je l'ai fait:

  1. Dans MyBundle/DQL/field.php, j'ai inséré le code suivant (https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Field.php) (je viens de changer l'espace de noms pour être namespace MyBundle\DQL;

  2. , j'ajoute ensuite ce qui suit dans mon config.yml comme le montre la documentation Symfony2 (http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html)

    ORM: auto_generate_proxy_classes: "% kernel.debug%" entity_managers: défaut: auto_mapping: true dql: string_functions: champ : MyBundle \ DQL \ champ

  3. Alors, je l'ai écrit la requête suivante $ query = $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY FIELD(4,12,1)'); mais je reçois cette erreur: [Syntax Error] line 0, col 75: Error: Expected end of string, got '('

Répondre

5

Vous devez avoir un regard sur la fonction MySql FIELD.

Dans natif MySql vous feriez quelque chose comme ceci:

ORDER BY FIELD(a.id,4,12,1) 

La fonction de champ ne fait pas partie de la doctrine 2 la distribution, mais vous pouvez l'obtenir à partir du DoctrineExtensions.

Voir cette StackOverflow post pour plus d'informations sur l'utilisation de la fonction FIELD dans Doctrine 2

EDIT

Je l'ai testé à l'aide de votre requête, mais a obtenu la même erreur de syntaxe. La requête suivante fonctionne pour moi. Vous ne savez pas pourquoi vous ne pouvez pas utiliser directement ORDER BY field(a.id,4,12,1), mais vous devez d'abord créer un champ HIDDEN dans votre sélection.

SELECT a, field(a.id,4,12,1) as HIDDEN field FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY field 

EDIT2

je l'ai fait un peu plus le débogage et la recherche et l'analyseur DQL ne semble pas en charge les fonctions de chaîne dans l'ordre par article. J'ai corrigé le problème et créé un Pull Request.

+0

Merci pour votre réponse, j'ai mis à jour ma question. – Reveclair

+0

Vous avez un doublon ')' dans votre requête.try: '$ em-> createQuery ('CHOISISSEZ UN FROM MyBundle: Artiste a WHERE a.id IN (4,12,1) ORDER BY FIELD (4,12,1)');' –

+0

Désolé, malheureusement, c'était une erreur sur stackoverflow mais c'était juste sur mon code $ query = $ em-> createQuery ('CHOISISSEZ UN FROM MyBundle: Artiste a O WH a.id IN (4,12,1) ORDER BY FIELD (4,12,1) '); Donc, je suis toujours avec la même erreur .. – Reveclair

0

Pas si bien que la fonction de domaine, mais devrait fonctionner:

SELECT output.a FROM (
    SELECT a, (CASE WHEN a.id = 4 THEN 1 WHEN a.id = 12 THEN 2 a.id = 1 THEN 3 END) ord FROM MyBundle:Artiste a WHERE a.id IN (4,12,1)) output ORDER BY output.ord 
Questions connexes