我正在尝试使用学说进行"复杂" 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中设置参数。