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

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