我在实体存储库中有一个与ManyToMany其他实体查询:会议有很多用户
这是我的qb:
$userIds = [2];
$qb = $this->createQueryBuilder('m')
->leftJoin('m.users', 'mu')
->leftJoin('mu.user', 'u')
->where('u.id IN (:ids)')
->setParameter('id', $userIds);
这很好,如果我要与两个用户开会,且id = 2的用户在其中,查询将给出两个用户的完整结果。
我的问题是,当我显示用户信息时,我有很多数据库查询(84),因此我使用addSelect这样:
$userIds = [2];
$qb = $this->createQueryBuilder('m')
->leftJoin('m.users', 'mu')
->addSelect('mu')
->leftJoin('mu.user', 'u')
->addSelect('u')
->where('u.id IN (:ids)')
->setParameter('id', $userIds);
太好了!我现在只有16个查询以获取显示信息。但是我的查询在与两个用户的会议中仅返回id = 2的用户???
如果我仅保留addSelect('mu'),则会遇到相同的问题。我认为addSelect()在不是我的搜索用户中不会执行。
如何使用addSelect()检索整个结果以减少查询?
感谢您的帮助
您可以添加另一个leftJoin来按用户参加的会议进行过滤。此leftJoin将不属于addSelect的一部分,因此在原始的addSelect中,您将拥有所有参加每个会议的用户]
您可以将查询更改为:
$qb = $this->createQueryBuilder('m')
->leftJoin('m.users', 'mu')
->addSelect('mu')
->leftJoin('mu.user', 'u')
->addSelect('u')
->leftJoin('mu.user', 'u_filter')
->where('u_filter.id IN (:ids)')
->setParameter('id', $userIds)
;