如何在教义2中按案例排序(Symfony2)

2022-08-30 16:23:10

我想通过使用Symfony 2.3中的教义来运行此查询。但似乎学说不理解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

答案 1

如果您使用的是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 native query。


答案 2

CASE 是特定于供应商的,不受原则的本地支持。

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

如果结果集太大,则应编写本机查询并冻结实体。有关这方面的详细信息,请参阅有关本机 SQL 的 Doctrine 文档。这看起来很可怕,但一旦你走过一个例子,它就有意义了。

作为最后的手段,您可以绕过原则并使用低级本机SQL。有关详细信息,请参阅此帖子

我知道 Doctrine Extensions 有一个 IfElse 函数,它可能会起作用,但我没有听说过很多成功的故事。


推荐