DOCTRINE:在声明中命令?

时间:2013-03-05 08:56:22

标签: 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();

我总是通过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:         默认:             auto_mapping:true             DQL:                 string_functions:                     字段: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 '('

2 个答案:

答案 0 :(得分:5)

您需要查看MySql FIELD函数。

在本机MySql中,您可以执行以下操作:

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

字段功能不是Doctrine 2发行版的一部分,但您可以从DoctrineExtensions获取。

有关在Doctrine 2中使用FIELD功能的更多信息,请参阅此StackOverflow post

修改

我已使用您的查询对其进行了测试,但语法错误相同。以下查询适用于我。不确定为什么不能直接使用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

<强> EDIT2

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

答案 1 :(得分:0)

不如FIELD功能好但应该有效:

  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