代码之家  ›  专栏  ›  技术社区  ›  Dula

在Doctrine QueryBuilder OrderBy中使用IF语句

  •  0
  • Dula  · 技术社区  · 4 年前

    我试图根据查询结果是否与属性上的原始实体匹配来排序查询结果。我可以通过以下查询在mySQL中轻松做到这一点:

    SELECT * FROM table
    ORDER BY prop = 'value' DESC;
    

    然而,在教义中,当我尝试以下内容时:

    // $qb is an instance of query builder
    $qb->select('e')
       ->from('Entity', 'e')
       ->orderBy('e.prop = :value', 'DESC')
       ->setParameter('value', 'value');
    // grab values
    

    我发现一个语法错误,“字符串结束”。我考虑过创建一个自定义函数,但这似乎有些过头了。我对教义还比较陌生,有更好的方法吗?

    0 回复  |  直到 13 年前
        1
  •  44
  •   Ocramius    13 年前

    由于ORM 2.2,您可以使用 HIDDEN 关键字并选择其他字段,在本例中使用 CASE 表达方式:

    SELECT
        e,
        CASE WHEN e.prop = :value THEN 1 ELSE 0 END AS HIDDEN sortCondition
    FROM
        Entity e
    ORDER BY
        sortCondition DESC
    
        2
  •  21
  •   PowerKiKi webjawns.com    8 年前

    在我花了一段时间研究如何使用php语法创建该查询时,我想到了以下几点:

    $value = 'my-value';    
    $qb->select('e')
        ->from('Entity', 'e')
        ->addSelect('CASE WHEN e.prop = :value THEN 1 ELSE 0 END AS HIDDEN sortCondition')
        ->setParameter('value', $value)
        ->addOrderBy('sortCondition', 'DESC');