У меня есть запрос в 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.