具有多个连接的 Doctrine 2 查询
Doctrine 2 query with multiple joins
我遇到了一个查询问题,希望有人可以帮助我编写代码。
我的 Class 看起来像这样:
人 1 ------ 1..* 参与 1...* -------- 1 事件
现在我在 class 事件上有一个名为 'isActive' 的属性,在人 Class 上我有一个属性 'isChecked'。
对于我的查询,我想 return 所有 'isChecked' 没有参加 'isActive' 活动的人。
到目前为止,这是我的查询,但它不是return我需要的:
$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');
如果有人能告诉我,我在这里做错了什么,那就太棒了。
亲切的问候,
塞巴斯蒂安
您需要使用 WITH
子句调整您的连接部分,从过滤条件中删除 ->andWhere('e.isActive = true')
并在连接您的实体部分时移动此子句,以便只有事件(行与pa) 返回标记为 isActive.
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');
我遇到了一个查询问题,希望有人可以帮助我编写代码。
我的 Class 看起来像这样:
人 1 ------ 1..* 参与 1...* -------- 1 事件
现在我在 class 事件上有一个名为 'isActive' 的属性,在人 Class 上我有一个属性 'isChecked'。
对于我的查询,我想 return 所有 'isChecked' 没有参加 'isActive' 活动的人。
到目前为止,这是我的查询,但它不是return我需要的:
$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');
如果有人能告诉我,我在这里做错了什么,那就太棒了。
亲切的问候, 塞巴斯蒂安
您需要使用 WITH
子句调整您的连接部分,从过滤条件中删除 ->andWhere('e.isActive = true')
并在连接您的实体部分时移动此子句,以便只有事件(行与pa) 返回标记为 isActive.
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');