Sql 条令:在规定的声明中?

Sql 条令:在规定的声明中?,sql,symfony,doctrine-orm,Sql,Symfony,Doctrine Orm,我使用的是Symfony2和条令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,同时我想显示按id列表排序的结果:4,然后12,然后1 更新 感谢@Bram Gerritsent comment

我使用的是Symfony2和条令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,同时我想显示按id列表排序的结果:4,然后12,然后1

更新 感谢@Bram Gerritsent comment,我注册了一个自定义DQL函数字段,下面是我所做的:

  • 在MyBundle/DQL/Field.php中,我插入了以下代码()(我刚刚将名称空间更改为
    namespace MyBundle\DQL;

  • 然后,我在config.yml中添加以下内容,如Symfony2文档所示()

    orm: 自动生成代理类:“%kernel.debug%” 实体管理人员: 违约: 自动映射:true dql: 字符串函数: 字段: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]第0行,第75列:错误:字符串的预期结尾,get'(


  • 您需要查看MySql
    字段
    函数

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

    ORDER BY FIELD(a.id,4,12,1)
    
    field函数不是Doctrine 2发行版的一部分,但您可以从中获得它

    有关使用条令2中的
    字段
    功能的更多信息,请参见此

    编辑

    我已使用您的查询对其进行了测试,但出现了相同的语法错误。以下查询对我有效。不确定为什么不能直接使用
    按字段排序(a.id,4,12,1)
    ,但您必须首先在选择中创建一个
    隐藏的
    字段

    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子句中的字符串函数。我已经解决了这个问题并创建了一个。

    您需要查看MySql
    字段
    函数

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

    ORDER BY FIELD(a.id,4,12,1)
    
    field函数不是Doctrine 2发行版的一部分,但您可以从中获得它

    有关使用条令2中的
    字段
    功能的更多信息,请参见此

    编辑

    我已使用您的查询对其进行了测试,但出现了相同的语法错误。以下查询对我有效。不确定为什么不能直接使用
    按字段排序(a.id,4,12,1)
    ,但您必须首先在选择中创建一个
    隐藏的
    字段

    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子句中的字符串函数。我已经解决了这个问题,并创建了一个。

    不如字段函数好,但应该可以工作:

      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
    

    没有字段函数那么好,但应该可以工作:

      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
    

    您的查询中有一个重复的
    。请尝试:
    $em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id in(4,12,1)ORDER BY FIELD(4,12,1);
    抱歉,不幸的是,stackoverflow上有一个错误,但我的代码$query=$em->createQuery('SELECT a FROM MyBundle:Artiste a WHERE a.id in(4,12,1)ORDER BY FIELD(4,12,1);,所以我仍然有相同的错误..我对您的新查询没有任何错误,但结果总是按如下顺序排列:1,4,12,不考虑ID在“field”语句和“in”中的顺序在语句中,当我使用查询时,我得到了正确的排序。你能得到原始SQL字符串并直接对DB执行它吗?
    $query->getSql()
    这是这个条令查询中的原始SQL查询($query=$em->createQuery('SELECT a.id,field(12,4,1)作为MyBundle中的隐藏字段:Artiste a,其中a.id按字段排序');)----原始sql----“从Artister a0中选择a0.id作为id0,字段(12,4,1)作为sclr1,其中a0.id按照sclr1 ASC的(12,4,1)顺序排列”您在查询中有一个重复的
    。尝试:
    $em->createQuery('SELECT a FROM MyBundle:Artister a其中a.id按照字段(4,12,1)的顺序排列(4,12,1)。”
    很抱歉,不幸的是,stackoverflow上出现了一个错误,但我的代码$query=$em->createQuery(从MyBundle中选择a:Artister a,其中a.id按字段(4,12,1)排序);因此,我仍然有相同的错误..我对您的新查询没有任何错误,但结果总是按如下顺序排列:1,4,12,不考虑ID在“field”语句和“in”语句中的顺序我在使用查询时得到了正确的排序。您能获得原始SQL字符串并直接对DB执行吗?
    $query->getSql()
    这里是这个条令查询中的原始sql查询($query=$em->createQuery('SELECT a.id,field(12,4,1)作为MyBundle中的隐藏字段:Artister a,其中a.id按字段排序(12,4,1));----原始sql---'SELECT a0_id作为id0,field(12,4,1)作为Artister a0中的sclr1,其中a0_id按sclr1排序'