为什么queryBuilder中的addSelect()会更改我的查询结果

问题描述 投票:0回答:1

我在实体存储库中有一个与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()检索整个结果以减少查询?

感谢您的帮助

symfony repository left-join query-builder doctrine-query
1个回答
0
投票

您可以添加另一个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)
;
© www.soinside.com 2019 - 2024. All rights reserved.