如何通过单查询获取关联用户的Things对象,解决N+1查询问题
解决N+1查询问题:单查询获取包含关联用户的物品对象
完全可以通过单查询实现,核心是利用Doctrine的**关联预加载(Fetch Join)**机制,一次性把物品和关联的用户数据查出来,避免循环时的额外查询。
修改后的代码
$things = $this->createQueryBuilder('t') ->join('t.user', 'u') ->addSelect('u') ->getQuery() ->getResult();
代码说明
join('t.user', 'u'):建立things表(别名t)与users表(别名u)的关联,对应实体中定义的一对多关系addSelect('u'):将用户实体的所有字段加入查询结果,Doctrine会自动把查询到的用户对象绑定到对应的物品对象上- 执行后只会生成一条SQL查询,一次性获取所有物品及其关联用户的完整数据,彻底消除N+1查询问题
特殊场景处理
如果存在物品未关联用户的情况,改用leftJoin确保所有物品都能被查询到:
$things = $this->createQueryBuilder('t') ->leftJoin('t.user', 'u') ->addSelect('u') ->getQuery() ->getResult();
此时循环调用$thing->getUser()->getName()时,用户对象已提前加载到内存中,不会再触发任何额外SQL查询。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

