首页 > 解决方案 > 具有多个连接的 Doctrine 2 查询

问题描述

我被一个查询困住了,我希望有人可以帮助我的代码。

我的课程看起来像这样:

人 1 ------- 1..* 参与 1...* -------- 1 事件

现在我在 Event 类上有一个名为“isActive”的属性,在 Person 类上有一个属性“isChecked”。

通过我的查询,我想返回所有未参与“isActive”事件的“isChecked”人员。

到目前为止,这是我的查询,但它没有返回我需要的内容:

$query = $em->createQueryBuilder('c')
        ->select('p')
        ->from('AppBundle:Person', 'p')
        ->andWhere('p.isChecked = true')
        ->leftJoin('p.participation', 'pa')
        ->andWhere('pa IS NULL')
        ->leftJoin('pa.event', 'e')
        ->andWhere('e.isActive = true');

如果有人能告诉我,我在这里做错了什么,那就太棒了。

亲切的问候,塞巴斯蒂安

标签: sqldatabasesymfonydoctrinedql

解决方案


您需要通过 usingWITH子句调整您的连接部分,->andWhere('e.isActive = true')从 where 过滤器中删除并将此子句移动到连接部分实体中,以便仅返回标记为 isActive 的事件(行与 pa 连接)。

DQL

SELECT p
FROM AppBundle:Person p
LEFT JOIN p.participation pa
LEFT JOIN pa.event e WITH e.isActive = true
WHERE p.isChecked = true
AND pa IS NULL

在查询生成器中,您可以将其表示为

$query = $em->createQueryBuilder('c')
        ->select('p')
        ->from('AppBundle:Person', 'p')
        ->leftJoin('p.participation', 'pa')
        ->leftJoin('pa.event', 'e','WITH', 'e.isActive = true')
        ->andWhere('p.isChecked = true')
        ->andWhere('pa IS NULL');

推荐阅读