Доктрина 2.1: Получение и назначение COUNT (t.id) из подзапроса? - PullRequest
1 голос
/ 10 марта 2012

У меня есть две сущности в 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 и с использованием подвыборов.

Итак, я полагаю, что присвоить что-либо кроме скалярного значения невозможно?

Главный вопрос остается, хотя ..

1 Ответ

0 голосов
/ 19 марта 2012

Вы также можете использовать нативные SQL-запросы в Doctrine для такого рода конкретных запросов.DQL по-своему мощен, но он также ограничен из-за ограничений производительности.Использование собственных SQL-запросов и отображение результатов приведет к тому же результату, и в этом нет недостатка.

Документация объясняет это подробно.

...