我对原则 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 表达式。
我尝试了一下,得到了
"Error: Class '(' is not defined."
我发现我们也可以使用查询生成器来执行此操作。
作为原则 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 ();
最佳答案
Subqueries seem to be unavailable in DQL, so I don't know how to transform :
事实上,确实如此。你的代码(无意冒犯)很难读,所以我给你举个例子:
//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 是通过虚构的子查询获取的类别 ID。这 100% 有效。
您应该对您的要求应用相同的逻辑。
此外,在使用连接时,您不应该使用ON
语句,这是由学说处理的。
关于doctrine-orm - Doctrine 2/Zend Framework 2 中 DQL 中的 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474066/