Doctrine orm 原则2/Zend框架2中DQL的内部连接

Doctrine orm 原则2/Zend框架2中DQL的内部连接,doctrine-orm,zend-framework2,dql,doctrine-query,Doctrine Orm,Zend Framework2,Dql,Doctrine Query,我对原则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) i

我对原则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表达式

我试过了,结果成功了

错误:未定义类“(”

我看到我们也可以使用查询生成器来实现这一点

作为第二信条的新手,有人能解释一下我是如何做到这一点的吗

我的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 ();
子查询在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
事实上,它们是。您的代码(没有冒犯)几乎不可读,因此我将给您一个示例:

//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文件。您不应该在controller中创建查询

本例仅当商品的价格大于50且类别ID是虚构子查询获取的商品时,才会获取类别。这100%有效

您应该对您的需求应用相同的逻辑


另外,在使用连接时,您不应该使用
ON语句,这是由条令处理的。

如果您在实体中正确定义了关系,那么您可以对这些关系进行连接。正如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();
$dql=
getResult();

与之相关的
(“
”(“
”)我可以看到在你的查询中有两个
(“
”)。你是否尝试过先减少(简化)查询以使其运行,然后逐步扩展它?我在网上搜索了一个答案,结果看起来像“(”在DQL中不可用。因此我正在尝试找到一种不使用“(”的方法。此表达式在SQL中工作。完整错误是:
[Semantical error]第0行,第109列靠近“((bddoctor\Entity\Domaine):错误:Class”('未定义。
请将您的DQL添加到问题中-即使不起作用。顺便说一句,如果您提出问题,这通常非常有用。我将其添加到问题中。感谢您的建议。我会记得这样做。是的,来自不了解您的代码的人(您的计算机上有),问题本身必须清楚。例如,此处,错误消息必须与某个内容匹配,但您没有先发布它,因此我指的是错误的示例查询。