我在教義中有以下代碼:
return $this->createQueryBuilder('t')
->where('t.status LIKE :status')
->orderBy('t.createdAt', 'DESC')
->setParameter('status', $status)
->setMaxResults($limit)
->getQuery()
->getResult()
;
然而,我想要構建的真正 SQL 查詢是這樣的:
SELECT t.*,
IF(deleted = 1, 4, status) AS status
FROM trm t
WHERE status = 3 ORDER BY created_at DESC;
如果列“已洗掉”為真,則實質上將狀態列替換為 = 4。
如何在上面的學說查詢中重新創建它?
我試過調查 ->expr()->eq 但我找不到任何簡單的例子。我什至不確定它們是否是我需要使用的。
uj5u.com熱心網友回復:
Doctrine 默認不IF支持運算式。相反CASE,支持運算式,可以轉換為:CASE t.deleted WHEN 1 THEN 4 ELSE t.status END
您轉換為 ORM QueryBuilder 的原始查詢將是:
$this->createQueryBuilder('t')
->addSelect('CASE t.deleted WHEN 1 THEN 4 ELSE t.status END AS status')
->where('t.status LIKE :status')
->orderBy('t.createdAt', 'DESC')
->setParameter('status', $status)
->setMaxResults($limit)
->getQuery()
->getResult();
但是,這不會修改發送到物體的值,而是生成一個嵌套陣列結果,其中status值分隔。
array
array
[0] => Entity (Object)
['status'] => 4
array
[0] => Entity (Object)
['status'] => 4
// ...
uj5u.com熱心網友回復:
你需要 DoctrineExtnesions ( https://github.com/beberlei/DoctrineExtensions )
orm:
..
entity_managers:
....
dql:
....
string_functions:
IF: DoctrineExtensions\Query\Mysql\IfElse
但是以這種方式修改物體并不是一個好習慣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/456398.html
