【问题标题】:Why addSelect() in queryBuilder change my query result为什么 queryBuilder 中的 addSelect() 会改变我的查询结果
【发布时间】:2026-02-17 11:20:06
【问题描述】:

我在实体存储库中有一个带有 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】:

    您可以添加另一个 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)
    ;
    

    【讨论】: