FLOW3 Doctrine2 :: SELECT b, count (b) ОТ (ВЫБЕРИТЕ a, b ОТ x \ y \ z GROUP BY a) GROUP BY b - PullRequest
2 голосов
/ 08 ноября 2011

Я совершенно новичок в 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();

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

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

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

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

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

Edit 5: Теперь она работает с использованием nativeQuery, см. мой ответ на этот вопрос ...

1 Ответ

0 голосов
/ 08 ноября 2011

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

$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);
...