首页 > 解决方案 > 为什么 queryBuilder 中的 addSelect() 会改变我的查询结果

问题描述

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

感谢帮助

标签: symfonyrepositoryleft-joinquery-builderdoctrine-query

解决方案


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

推荐阅读