У меня есть следующий код в Doctrine:
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, если столбец «удален» имеет значение true.
Как я могу воссоздать это в запросе доктрины выше?
Я пытался изучить ->expr()->eq, но не могу найти простых примеров для подражания. Я даже не уверен, что они мне нужны.






вам понадобятся DoctrineExtnesions ( https://github.com/beberlei/DoctrineExtensions )
orm:
..
entity_managers:
....
dql:
....
string_functions:
IF: DoctrineExtensions\Query\Mysql\IfElse
но изменение объекта таким образом не является хорошей практикой.
По умолчанию 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
// ...
Спасибо, это примерно так близко, как я собираюсь получить, я думаю :)