2

我对 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 ();
4

2 回答 2

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语句,这是由学说处理的。

于 2013-07-04T17:22:08.300 回答
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();
于 2013-07-05T15:02:33.507 回答