DOCTRINE:在声明中命令?

Rev*_*air 1 sql symfony doctrine-orm

我正在使用Symfony2和doctrine 2,我对此查询有问题:

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

而且我总是通过a.id得到结果顺序,即1然后是4然后12我想要显示以ids列表排序的结果:4然后是12然后是1.

更新 感谢@Bram Gerritsent评论,我注册了一个自定义DQL函数FIELD,所以这就是我所做的:

  1. 在MyBundle/DQL/Field.php中,我插入了以下代码(https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Field.php)(我刚刚更改了)要命名空间namespace MyBundle\DQL;

  2. 然后,我在我的config.yml中添加以下内容,如Symfony2文档中所示(http://symfony.com/doc/2.0/cookbook/doctrine/custom_dql_functions.html)

    orm:auto_generate_proxy_classes:"%kernel.debug%"entity_managers:default:auto_mapping:true dql:string_functions:field:MyBundle\DQL\Field

  3. 所以,我写了以下查询$ query = $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id IN (4,12,1) ORDER BY FIELD(4,12,1)');但是我收到了这个错误:[Syntax Error] line 0, col 75: Error: Expected end of string, got '('

Bra*_*sen 5

你需要看看MySql FIELD函数.

在本机MySql中,你会做这样的事情:

ORDER BY FIELD(a.id,4,12,1)
Run Code Online (Sandbox Code Playgroud)

字段函数不是Doctrine 2发行版的一部分,但您可以从DoctrineExtensions中获取它.

有关在Doctrine 2中使用该函数的更多信息,请参阅此StackOverflow文章FIELD

编辑

我已使用您的查询对其进行了测试,但语法错误相同.以下查询适用于我.不确定为什么你不能ORDER BY field(a.id,4,12,1)直接使用,但你必须先HIDDEN在你的选择中创建一个字段.

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
Run Code Online (Sandbox Code Playgroud)

EDIT2

我已经做了一些调试和研究,DQL解析器似乎不支持order by子句中的字符串函数.我已经解决了这个问题并创建了一个Pull Request.