Доктрина – подзапрос из

У меня есть запрос в MySQL:

SELECT * FROM ( SELECT COUNT(*) AS count, t.name AS name FROM tag t INNER JOIN video_has_tag v USING (idTag) GROUP BY v.idTag ORDER BY count DESC LIMIT 10 ) as tags ORDER BY name 

и я хочу написать это в доктрине. Как я могу это сделать? Я написал:

 Doctrine_Query::create() ->select('COUNT(t.idtag) as count, t.name') ->from('Tag t') ->innerJoin('t.VideoHasTag v') ->groupBy('v.idTag') ->orderBy('count DESC, t.name') ->limit(30) ->execute(); 

Но я не могу поместить его в «из», чтобы сортировать по имени.

Это ответ:

 $q = new Doctrine_RawSql(); $q->addComponent('t', 'Tag') ->select('{t.name}, {t.count}') ->from('(SELECT COUNT(*) as count, t.name,t.idtag FROM Tag t INNER JOIN Video_Has_Tag v USING(idTag) GROUP BY v.idTag ORDER BY count DESC LIMIT 50) t') ->orderBy('name'); 

Я использую Doctrine 1.2 и Symfony 1.4, а Doctrine_RawSql работает с подзапросами. Затем вы можете addComponent для моделей.

Стоит упомянуть то, что вы не можете напрямую использовать объекты Doctrine_Query качестве подзапросов, но вы можете легко получить форму SQL с помощью getSqlQuery() или даже getSqlQueryPart и использовать результат для подзапроса.

getSqlQueryPart полезен при восстановлении только определенных частей запроса.

Doctrine не может выполнить подзапрос в предложении FROM (и он не может подключиться к подзапросу). Ваш текущий запрос Doctrine будет сортироваться по счету, а затем по имени. Разве это не то, что вы хотите?

Doctrine позволит вам поместить подзапрос в предложение FROM. Однако в подзапросе он может принимать текстовые операторы DQL, вы не можете использовать другой объект запроса. Если вы переписываете свой подзапрос DQL в текстовой форме, вы сможете использовать его.

См. Эту страницу документации для примера. Пример помещает подзапрос DQL в предложение WHERE, но в нем упоминается, что вы можете использовать подзапросы в предложении FROM.