具有多个联接的Doctrine 2查询

时间:2018-06-12 08:40:55

标签: sql database symfony doctrine dql

我遇到了一个查询,我希望有人可以帮助我的代码。

我的班级看起来像这样:

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

现在我在类Event上有一个名为' isActive'在人类中,我有一个属性' isChecked'。

通过我的查询,我想要返回所有' isChecked'没有参与' isActive'事件

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

$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');

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

亲切的问候, 塞巴斯蒂安

1 个答案:

答案 0 :(得分:0)

您需要使用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');