FLOW3 Doctrine2 :: SELECT b,count(b) FROM (SELECT a,b FROM x\y\z GROUP BY a) GROUP BY b

Я новичок в FLOW3 и очень плохо знаком с Doctrine.

Я просто провожу несколько тестов и хочу изучить или понять некоторые методы, которые буду использовать позже. Теперь я застрял в этой части доктрины, где я хочу сгенерировать некоторую статистику.

$results = $this->entityManager
    ->createQuery('SELECT version,count(version) 
        FROM (SELECT device, version 
            FROM \MyStuff\Stats\Domain\Model\Stat 
            WHERE 
                date > \'2011-10-01 00:00:00\' and 
                date < \'2011-10-02 00:00:00\' 
            GROUP BY device) GROUP BY version')
    ->getResult();

Я спрашивал и в других местах, где меня направляли на Doctrine Docs. Что ж, теперь есть несколько примеров, но эти 2 лайнера тривиальны, и я не смог найти ни одного примера, связанного с таким подзапросом.
Итак, я надеюсь, что кто-то здесь может мне помочь.

Изменить:
Я хотел бы решить эту проблему с помощью dql.
Я пытался решить эту проблему с помощью построителя запросов, но мне сказали, что построитель запросов != dql

Редактировать 2:
Теперь мне сказали, что доктрина 2 не поддерживает подвыборки в "FROM (SUBSELECT)", но поддерживает "... WHERE IN (SUBSELECT)" и что можно переписать мой запрос к форме IN(). Что ж, попробуем разобраться сейчас.

Редактировать 3: мне не удается переписать исходный подзапрос во внутренний подзапрос. Итак... dql не выполняет подзапросы, и нет другого способа сделать с dql то, что я хочу?! Я бы сказал, что тогда в dql не будет очень важной функции. Или я просто не вижу что-л. здесь ?

Редактировать 4: я наконец-то получил внутренний подзапрос, но он был примерно в 10 раз медленнее (4 секунды вместо 0,4), и теперь некоторые ребята из доктрины из #doctrine сказали мне, что я должен использовать nativeQuery функция вместо этого.

Редактировать 5: Теперь он работает с использованием nativeQuery, см. мой ответ для этого...


person Allisone    schedule 08.11.2011    source источник


Ответы (1)


Используя собственный запрос, он работает так...

$rsm = new \Doctrine\ORM\Query\ResultSetMapping();
$rsm->addScalarResult('version', 'version');
$rsm->addScalarResult('count', 'count');
$results = $this->entityManager
    ->createNativeQuery(
        'SELECT version, COUNT(version) as count FROM
        (
            SELECT device, version 
            FROM mystuff_stats_domain_model_stat 
            WHERE 
                date > \'2011-10-01 00:00:00\' and 
                date < \'2011-10-02 00:00:00\' 
            GROUP BY device
        ) 
        as devices GROUP BY version',$rsm)
    ->execute();
echo var_dump($results,true);
person Allisone    schedule 08.11.2011