У меня есть две сущности в Doctrine 2.1: Category
и Site
, у каждой категории есть много сайтов, и у каждого сайта есть родительская категория.
Я хотел бы сделать один запрос на обновление (в DQL), который обновит поле с именем count
объекта Category с количеством связанных сайтов.
Так что в SQL я бы сделал что-то вроде этого:
UPDATE categories c SET c.count = (SELECT COUNT(s.id) FROM sites s WHERE s.category_id = c.id);
Это будет работать красиво, в DQL это может выглядеть примерно так:
UPDATE PackageNameBundle:Category c SET c.count = (SELECT COUNT(s.id) FROM PackageNameBundle:Site s WHERE s.category = c)
Такая попытка вызывает [Syntax Error] line 0, col 61: Error: Expected Literal, got 'SELECT'
.
Подзапросы действительно работают в DQL, но проблема здесь (насколько я понимаю) состоит в том, что Doctrine не может присвоить возвращенное значение из подзапроса c.count
. Это понятно, так как я могу получить более 1 поля в подзапросе и даже более одной строки. Это волшебно работает в MySQL, так как он видит одну строку, одно поле и для удобства возвращает одно целочисленное значение. С другой стороны, доктрина должна быть объектно-ориентированной и работать с другими механизмами, где такие преобразования могут не поддерживаться.
Наконец, мой вопрос:
Каков наилучший способ сделать это в Doctrine, следует ли мне использовать Native SQL или это можно сделать с помощью DQL и как?
Заранее спасибо!
РЕДАКТИРОВАТЬ: Я только что нашел эту цитату в DQL Docs:
- Ссылки на связанные объекты возможны только в предложении WHERE и с использованием подвыборов.
Итак, я полагаю, что присвоить что-либо кроме скалярного значения невозможно?
Главный вопрос остается, хотя ..