Подзапрос Doctrine в InnerJoin

у меня есть функциональный запрос в MySql:

select t.won,e.etot, s.username,s.country,r.points,r.rank FROM sf_guard_user s 
INNER JOIN marks r ON r.user_id = s.id 
inner join (select t.user_id,count(t.user_id)as won from topper t group by t.user_id) t on t.user_id=s.id
inner join (select e.user_id,count(e.user_id)as etot from exams e group by e.user_id) e on e.user_id=s.id
ORDER BY r.rank asc

я написал код доктрины в классе sfGuardUserTable:

$q= $this->createQuery('u');

        $wq =$q->createSubquery()
         ->select('t.user_id,count(t.user_id) won')
         ->from('Topper t')
         ->groupBy('t.user_id');

        $dq = $q->createSubquery()
         ->select('e.user_id,count(e.user_id) etot')
         ->from('Exams d')
         ->groupBy('d.user_id');

        $q->select(' t1.won, e1.dtot, u.username,u.country,r.points,r.rank')
         ->innerJoin ('u.Marks r ON r.user_id = u.id')
         ->innerJoin ('u.('.$wq->getDql().') t1 on t1.user_id=u.id')
         ->innerJoin ('u.'.$dq->getDql().' e1 on e1.user_id=u.id')
         ->orderBy('r.rank asc');

        //echo $q->getSql();
        return $q;

выдает ошибку Не удалось найти класс SELECT :( пожалуйста, помогите мне. Заранее спасибо.


person S.Sid    schedule 06.01.2010    source источник
comment
Почему необходимо так абстрагировать запрос? Просто напечатайте его, как нормальные люди.   -  person Tor Valamo    schedule 06.01.2010
comment
ТЫ ДЕЛАЕШЬ ЭТО НЕПРАВИЛЬНО. Вам не нужна Doctrine для таких запросов ($q->select(' t1.won, e1.dtot, u.username,u.country,r.points,r.rank')).   -  person Andrei Dziahel    schedule 06.01.2010
comment
@ tor Valamo: не могли бы вы подсказать, как писать нормально. я имею в виду, что это единственный известный мне способ, потому что я не хочу выполнять более одного запроса для одной и той же задачи.   -  person S.Sid    schedule 06.01.2010


Ответы (1)


я попытался выполнить свой собственный запрос напрямую с помощью параметра запроса Doctrine Row Sql и его работы :) мне понравилось делиться им здесь:

$q = new Doctrine_RawSql();
        $q->select('{t.won}, {e.etot}, {s.username},{s.country},{r.marks},{r.ranks}');
        $q->from('sf_Guard_User s INNER JOIN marks r ON r.user_id = s.id inner join (select t.id,t.user_id,count(t.user_id)as won from topper t group by t.user_id) t on t.user_id=s.id inner join (select d.id,d.user_id,count(e.user_id)as etot from exams e group by e.user_id) e on e.user_id=s.id ORDER BY r.rank asc');
        $q->addComponent('s', 'sfGuardUser s');
        $q->addComponent('r', 's.Marks r');
        $q->addComponent('t', 's.Topper t');
        $q->addComponent('e', 's.Exams e');
        return $q;

для получения дополнительной помощи прочитайте.

person S.Sid    schedule 06.01.2010
comment
Я не уверен, что это лучшее решение, но оно работает и для меня :). - person martin; 09.07.2010