我在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 ();
答案 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();