如何使用多个连接编写此学说查询?

时间:2012-12-19 14:19:52

标签: doctrine-orm doctrine query-builder doctrine-query

我有一个实体Person(p),它与实体NotificationType相关的实体通知有关。

  • 有些人收到了类型1的通知(notification_type_id = 1)。
  • 有些人收到了通知但未收到类型1的通知
  • 有些人根本没有收到消息。

在全球范围内,我想检索那些没有收到类型1消息的人。

我写了这个查询:

$qb = $this->createQueryBuilder('p')
        ->leftJoin('p.notifications', 'n')
        ->leftJoin('p.notification_type', 'nt')
        ->addSelect(array('p','n','nt'))
        ->where('nt.id NOT IN (1)')
        ->orderBy('p.name', 'ASC');
return $qb->getQuery()->getResult();

但是通过这个查询,我只收到那些收到通知但没有收到通知的人,我没有收到那些没有收到通知的人。

如何纠正我的查询以获得这些查询?

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

NOT IN with null值(对于没有消息的连接)将不会按预期进行解析。同样适用于eq或ne。

尝试:

$qb = $this->createQueryBuilder('p');
$results = $qb->leftJoin('p.notifications', 'n')
              ->leftJoin('p.notification_type', 'nt')
              ->addSelect(array('p','n','nt'))
              ->where('nt.id !=1')
              ->orWhere('nt.id IS NULL')
              ->orderBy('p.name', 'ASC');
return $qb->getQuery()->getResult();  

您也可以将这些条件作为条件加入,请参阅学说代码的13.2.5. The Expr class

顺便说一下,您可能不需要select,因为您可以通过实体中的getter以编程方式访问这些值。