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本机查询.
小智 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)
CASE 是特定于供应商的,并且不受条令本身支持。
如果结果很小,我的建议是提取整个结果集,然后对数组进行排序。
如果结果集太大,您应该编写本机查询并对实体进行水合。有关详细信息,请参阅Native SQL 的 Doctrine 文档。它看起来很吓人,但是一旦你看完一个例子就明白了。
作为最后的手段,您可以绕过原则并使用低级本机 SQL。请参阅这篇文章了解详细信息。
我知道Doctrine Extensions 有一个 IfElse 函数可能有效,但我还没有听说过很多成功的故事。
| 归档时间: |
|
| 查看次数: |
10605 次 |
| 最近记录: |