我正在使用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,所以这就是我所做的:
在MyBundle / DQL / Field.php中,我插入了以下代码(https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Field.php)(我刚刚将命名空间更改为namespace MyBundle\DQL;
然后,我在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
所以,我写了以下查询$ 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 '('
答案 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