如何在Doctrine2中按案例排序(Symfony2)

Tin*_*yen 22 php mysql case-when symfony doctrine-orm

我想在Symfony 2.3中使用Doctrine来运行此查询.但似乎Doctrine不理解CASE声明.有人可以帮忙吗?先感谢您!

SELECT max(id) id, name
FROM cards
WHERE name like '%John%'
GROUP BY name
ORDER BY CASE WHEN name like 'John %' THEN 0
           WHEN name like 'John%' THEN 1
           WHEN name like '% John%' THEN 2
           ELSE 3
      END, name
Run Code Online (Sandbox Code Playgroud)

小智 50

如果您正在使用createQueryBuilder,那么您可以使用like

$query->addSelect("(CASE WHEN name like 'John %' THEN 0
           WHEN name like 'John%' THEN 1
           WHEN name like '% John%' THEN 2
           ELSE 3 END) AS HIDDEN ORD ");
$query->orderBy('ORD', 'DESC');

请注意,您必须拥有"隐藏".

您也可以使用doctrine本机查询.

  • 谢谢你的"隐藏"的事情 - 从来没有见过,但多年来我真的需要的东西:) (11认同)
  • 在这种情况下,该学说将“ ORD”的名称更改为“ sclr16”。我能做什么? (2认同)

小智 5

我遇到了类似的问题,我必须在结果顶部添加一些数字前缀。所以我这样解决:

    $qb = $this->createQueryBuilder('numberPrefix');
    $qb
        ->select('country.code','numberPrefix.prefix')
        ->addSelect('
            (CASE WHEN country.code = :firstCountryCode THEN 1
            WHEN country.code = :secondCountryCode THEN 2
            WHEN country.code = :thirdCountryCode THEN 3
            WHEN country.code = :fourthCountryCode THEN 4
            ELSE 5 END) AS HIDDEN ORD')
        ->innerJoin('numberPrefix.country','country')
        ->orderBy('ORD, country.id')
        ->setParameters(
            [
                'firstCountryCode' => $firstCountryCode,
                'secondCountryCode' => $secondCountryCode,
                'thirdCountryCode' => $thirdCountryCode,
                'fourthCountryCode' => $fourthCountryCode,
            ]
        );
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 2

CASE 是特定于供应商的,并且不受条令本身支持。

如果结果很小,我的建议是提取整个结果集,然后对数组进行排序。

如果结果集太大,您应该编写本机查询并对实体进行水合。有关详细信息,请参阅Native SQL 的 Doctrine 文档。它看起来很吓人,但是一旦你看完一个例子就明白了。

作为最后的手段,您可以绕过原则并使用低级本机 SQL。请参阅这篇文章了解详细信息。

我知道Doctrine Extensions 有一个 IfElse 函数可能有效,但我还没有听说过很多成功的故事。