Doctrine addSelect()原则存储库存在问题。多对多关系

Doctrine addSelect()原则存储库存在问题。多对多关系,doctrine,repository,many-to-many,symfony5,Doctrine,Repository,Many To Many,Symfony5,我有symfony 5、doctrine 2和PHP7.3 四个实体: OrderworkMeeting谁包含一个会议 包含多个MeetingUsers的会议 包含一个用户和一个会议的会议用户(用于会议和用户之间的多对多关系) 使用者 当我在OrderworkMeeting存储库中请求获取一个特定用户的所有OrderworkMeeting时,我只返回一个用户,无法查看同一会议中的其他用户 我认为这是错误,因为如果我在此之前复制了请求,但没有特定的用户,这就是工作 代码如下: $list

我有symfony 5、doctrine 2和PHP7.3

四个实体:

  • OrderworkMeeting谁包含一个会议
  • 包含多个MeetingUsers的会议
  • 包含一个用户和一个会议的会议用户(用于会议和用户之间的多对多关系)
  • 使用者
  • 当我在OrderworkMeeting存储库中请求获取一个特定用户的所有OrderworkMeeting时,我只返回一个用户,无法查看同一会议中的其他用户

    我认为这是错误,因为如果我在此之前复制了请求,但没有特定的用户,这就是工作

    代码如下:

        $list = $repo_om->getByUser([15]);
        foreach ($list as $oo) {
            var_dump(count($oo->getMeeting()->getUsers()));
        }
    
    返回1

        $listForNothing = $repo_om->getByUser();
    
        $list = $repo_om->getByUser([15]);
        foreach ($list as $oo) {
            var_dump(count($oo->getMeeting()->getUsers()));
        }
    
    返回2

    在我的OrderworkMeetingrepository中:

    public function getByUser($userId=0){
        $qb = $this->createQueryBuilder('om');
        $qb ->leftJoin('om.meeting', 'm')
            ->addSelect('m')
            ->leftJoin('m.users', 'mu')
            ->addSelect('mu')
            ->leftJoin('mu.user', 'u')
            ->addSelect('u');
    
        $this->setQbListLink($qb);
        $this->addQbOtherListLink($qb);
    
        if($userId){
           $or = $qb->expr()->orX();
           $or->add('u.id IN (:id)');
           $qb->setParameter('id', $userId);
           $qb->andWhere($or);
        }
    
        ->orderBy('m.date', 'DESC');
        return $qb->getQuery()->getResult();
    }
    
    我不明白的是什么? 欢迎你的帮助,我想我是傻瓜:)

    提前谢谢

    编辑:

    在我的项目中进行了其他测试之后,我发现我的条令问题爆发了:

    使用addSelect():16个查询, 无:84个查询

    所以我真的需要addSelect来减少查询

    我不明白为什么在我删除addSelect时这可以解决我的问题?我读到addSelect“merge”查询字段,但这如何以及为什么会改变我的结果? 那是从fields的名字来的吗


    非常感谢您的帮助

    添加
    addSelect
    语句有什么特殊原因吗?只需进行连接,直到您能够查询用户(例如,在您的MtM连接实体中)就足够了。所以:
    ->createQueryBuilder('om')->join('om.meeting','m')->addCriteria((新标准)->expr()->contains('mu.users',$users))->getQuery()->getResult()
    (我想应该是用玻璃杯(或3)盲目地键入它)另外,从外观上看,它涉及到一个存储库函数,使该函数需要一个用户数组:
    /**@var User[]$users*/public function getByUsers(array$users):array{…}
    (或单数:
    public function getByUser(User$User):array{…}
    -但不是通过id
    int
    -太混乱(意见)感谢rkeet的回复,我删除了addSelect并完成了它的工作。这是一个非常大的项目,我在任何地方使用这个addSelect都没有任何问题…我不知道为什么。对于array/int,这是一个错误的例子。非常感谢!