【问题标题】:Symfony QueryBuilder - filter collection in querySymfony QueryBuilder - 查询中的过滤器集合
【发布时间】:2019-12-11 14:25:43
【问题描述】:

我有一个这样的查询:

return $this->createQueryBuilder('supervision')
        ->join('supervision.supervisionEvents', 'supervisionEvents')
        ->andWhere('supervisionEvents.episode = :episode')
        ->setParameter('episode', $episode)
        ->getQuery()
        ->getResult()
        ;

我想获得除要过滤的监督事件之外的所有监督。 结果,我只想让 SupervisionEvents 带有 episode = :episode。

我使用了join、leftJoin和innerJoin。没有什么能像期望的那样工作。

我试图对加入有条件:

 ->innerJoin('s.supervisionEvents', 'supervisionEvent', 'WITH', 'supervisionEvent.episode = :episode')

但这也不行!

【问题讨论】:

  • 这是预期的行为,如果您只想拥有一些 SupervisionEvents,您需要使用 php 过滤它们或更改查询以仅搜索 SupervisionEvents。
  • 预期的行为是,你不能加入一个条件?
  • 您可以使用条件进行连接,但这只会更改找到的监督实体。您的查询(使用内部连接)意味着“获取所有监督实体,其中至少一个事件具有情节 =:情节”。使用教义,您不必像普通 sql 那样思考,而是考虑对象,教义将始终加载所有相关实体,您无法更改。

标签: database symfony join query-builder


【解决方案1】:

其实你们很亲近。您想仅在连接上过滤,因此对 连接子句使用带条件的左连接:

return $this->createQueryBuilder('supervision')
    ->addSelect('supervisionEvents')
    ->leftJoin('supervision.supervisionEvents', 'supervisionEvents', Join::WITH, 'supervisionEvents.episode = :episode')
    ->setParameter('episode', $episode)
    ->getQuery()
    ->getResult()
    ;

还需要选择连接的关系,以便在结果上水合。

参考文献

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 2022-11-08
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2018-07-22
    相关资源
    最近更新 更多