Доктрина - подзапрос из
У меня есть запрос в 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();
Но я не могу поместить его в "из" для сортировки по имени.
Ответы
Ответ 1
Это ответ:
$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');
Ответ 2
Я использую Doctrine 1.2 и Symfony 1.4 и Doctrine_RawSql
работает с подзапросами. Вы можете затем addComponent
для моделей.
Что-то стоит, так как вы не можете напрямую использовать Doctrine_Query
objects как подзапросы НО, вы можете легко получить форму SQL через getSqlQuery()
или даже getSqlQueryPart
и используйте результат для подзапроса.
getSqlQueryPart
полезен при восстановлении только определенных частей запроса.
Ответ 3
Doctrine не может выполнить подзапрос в предложении FROM (и он не может подключиться к подзапросу). Ваш текущий запрос Doctrine будет сортироваться по счету, а затем по имени. Разве это не то, что вы хотите?
Ответ 4
Doctrine позволит вам поместить подзапрос в предложение FROM. Однако в подзапросе он может принимать текстовые операторы DQL, вы не можете использовать другой объект запроса. Если вы переписываете свой подзапрос DQL в текстовой форме, вы сможете использовать его.
См. эту страницу документации для примера. В примере помещается подзапрос DQL в предложение WHERE, но в нем упоминается, что вы можете использовать подзапросы в предложении FROM.