在Doctrine 2 / Zend Framework 2中的DQL中的INNER JOIN

时间:2013-07-04 15:38:15

标签: doctrine-orm zend-framework2 dql doctrine-query

我在Doctrine 2中遇到DQL问题。

子查询似乎在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 ();

2 个答案:

答案 0 :(得分:1)

  

子查询似乎在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的产品时才会获取类别,而类别的ID是由虚构子查询提取的类别。这100%有效。

您应该对您的要求应用相同的逻辑。

此外,在使用联接时>不应使用ON语句,这是由学说处理的。

答案 1 :(得分:1)

如果您在实体中正确定义了关系,那么您可以在这些关系上进行连接。正如Zeljko所提到的,您不需要指定 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();