SQL Doctrine: InnerJoin where A.key = B.key or A.key = NULL



我正在尝试使用学说进行"复杂" SQL请求:我有一个具有多个代表团的体育项目。我创建了事件(' e'),以告诉每个人接下来会发生什么。

一个事件可以用于多个委托,如果是所有委托,则它链接到没有人(保存数据库空间)然后,我在事件和代表团之间建立了一个众多的关系

,我想在现在(->where('e.startTime > :date'))之后获取所有涉及一个委托('a')的事件('a')此事件由:

链接
->innerJoin('e.delegations', 'd', 'WITH', 'd.name = A' )

这项工作非常好,但是对于与没有人委派有关的事件,它不会返回然后我尝试了:

->leftJoin('e.delegations', 'd', 'WITH', 'd.name = A' )

但这返回所有事件

然后,我需要添加一个orWhere才能捕获e.delegations = null,但我不知道如何使用它,因为这会破坏以前的时间。也许我可以在Innerjoin中指定某些内容(例如或null之类的东西),但我在任何学说querybuilder doc中都没有找到它我用法语找到了这一点,但这只是使用一个加入和选择的地方,然后与内部/左联接相比,它肯定不是最佳的,并且很难维护。

问题

这个问题是一个小技巧,因为一旦我们按名称过滤委派(d.name = A),所有目的都没有任何事件(e),而没有该委托,但有其他委托,将被视为没有。因为过滤器将"删除"将要返回的其他代表团。

解决方案

使用子查询解决此问题:

//subquery - only returns event which has delegation 'A'
$sqb->select('e1.id')
    ->from('MyNamespaceEntityEvent','e1')
    ->innerJoin('e1.delegations', 'd', 'WITH', "d.name = 'A'");
//main query 
$qb
   ->leftJoin('e.delegations', 'd')       
   ->andWhere('e.delegation is null or e.id in ('.$sqb->getDQL().')'); 

ps
如果您需要在子查询中使用占位物(:param),请始终在主QueryBuilder中设置参数。

相关内容

最新更新