ВНУТРЕННЕЕ СОЕДИНЕНИЕ в DQL в Doctrine 2 / Zend Framework 2

У меня проблема с DQL в Doctrine 2.

Подзапросы кажутся недоступными в DQL, поэтому я не знаю, как преобразовать:

SELECT DISTINCT a.ID_DOMAINE, L_DOMAINE, b.ID_SS_DOMAINE, L_SS_DOMAINE, c.ID_COMPETENCE,     L_COMPETENCE
    FROM ((qfq_prod.REF_DOMAINE a inner join qfq_prod.REF_SS_DOMAINE b on a.id_domaine = b.id_domaine)
inner join qfq_prod.REF_COMPETENCE c on b.id_ss_domaine = c.id_ss_domaine)
inner join qfq_prod.REF_PERS_COMP d on c.id_competence = d.id_competence

в выражение DQL.

Я попробовал и получил

«Ошибка: класс '(' не определен».

Я видел, что мы можем использовать Query Builder для этого.

Будучи новичком в Doctrine 2, может кто-нибудь объяснить мне, как я могу это сделать, пожалуйста?

Мой DQL в настоящее время:

$query = $this->getEntityManager()->createQuery ( "SELECT DISTINCT a.ID_DOMAINE, L_DOMAINE, b.ID_SS_DOMAINE, L_SS_DOMAINE, c.ID_COMPETENCE, L_COMPETENCE
FROM ((BdDoctrine\Entity\Domaine a inner join BdDoctrine\Entity\SsDomaine b on a.id_domaine = b.id_domaine)
inner join BdDoctrine\Entity\Competence c on b.id_ss_domaine = c.id_ss_domaine)
inner join BdDoctrine\Entity\LienPersComp d on c.id_competence = d.id_competence" );

$res = $query->getResult ();

person Kiruchi    schedule 04.07.2013    source источник
comment
'(' к какому '(' это относится? Я вижу, что в вашем запросе есть два '('. Пытались ли вы сначала сократить свой запрос (упростить его), чтобы заставить его выполняться, а затем шаг за шагом расширять его?   -  person hakre    schedule 04.07.2013
comment
Я искал ответ в сети, и похоже, что (недоступны в DQL. Поэтому я пытаюсь найти способ сделать это без (. Это выражение работает в SQL. Полная ошибка: [Semantical Error] line 0, col 109 near '((BdDoctrine\Entity\Domaine': Error: Class '(' is not defined.   -  person Kiruchi    schedule 04.07.2013
comment
Пожалуйста, добавьте свой DQL к вопросу, даже если он не работает. это чаще всего очень полезно, если вы задаете вопрос, кстати.   -  person hakre    schedule 04.07.2013
comment
Я добавил это в вопросе. Спасибо за совет. Я не забуду сделать это.   -  person Kiruchi    schedule 04.07.2013
comment
Да, от человека, не знающего ваш код (у вас есть на компьютере), вопрос должен быть ясен сам по себе. Например. здесь сообщение об ошибке должно соответствовать чему-то, но вы не опубликовали его первым, поэтому я имел в виду неправильный пример запроса.   -  person hakre    schedule 04.07.2013


Ответы (2)


Подзапросы кажутся недоступными в DQL, поэтому я не знаю, как преобразовать:

На самом деле они есть. Ваш код (без обид) плохо читается, поэтому приведу пример:

//controller
$repo = $this->getDoctrine()->getRepository("Your:Bundle:Category") ;
$results = $repo->findAllForSomePage() ;

// CategoryRepository.php
public function findAllForSomePage()
{
    return $this->createQueryBuilder("o")
        ->innerJoin("o.products", "p", "WITH", "p.price>:price")->addSelect("p")
            ->setParameter("price", 50)
        ->where("o.id IN (SELECT s1.id FROM Your:Bundle:Something s1 WHERE s1.col1=5)")
        ->getQuery()->getResult() ;
}

Здесь предполагается, что у вас есть отношение Category hasMany Products и вы определили файл CategoryRepository. Вы никогда не должны создавать запросы в контроллере.

В этом примере категории будут извлекаться только в том случае, если у них есть продукты с ценой выше 50, И идентификаторы категорий — это те, которые получены вымышленным подзапросом. Это 100% работает.

Вы должны применить ту же логику к своему требованию.

Кроме того, вы не должны использовать оператор ON при использовании объединений, которые обрабатываются доктриной.

person Zeljko    schedule 04.07.2013

Если у вас правильно определены отношения в ваших сущностях, вы можете выполнять соединения с этими отношениями. И, как упомянул Желько, вам не нужно указывать условие ON, так как объекты уже должны знать, как они связаны. Вы присоединяетесь к объектам, а не к таблицам. (Это под капотом.)

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

$dql = 
<<<DQL    
SELECT 
    DISTINCT a.ID_DOMAINE, b.L_DOMAINE, b.ID_SS_DOMAINE, b.L_SS_DOMAINE, c.ID_COMPETENCE, c.L_COMPETENCE
FROM 
    BdDoctrine\Entity\Domaine a 
    JOIN a.ss_domaine b
    JOIN b.competence c
    JOIN c.lien_pers_comp d
DQL;

$query = $this->getEntityManager()->createQuery($dql);

$res = $query->getResult();
person chandlermania    schedule 05.07.2013