Symfony QueryBuilder关联查询:仅展示关联Partenaire的Structure
解决方案:Symfony中实现关联实体的搜索过滤
要同时实现仅显示当前Partenaire关联的Structure和搜索功能,只需要修改Repository的查询逻辑,把关联条件和搜索条件结合起来就行,步骤如下:
1. 更新StructureRepository的查询方法
修改原有的查询方法,新增Partenaire参数,在QueryBuilder里加入关联过滤条件,同时保留搜索逻辑:
// StructureRepository.php public function findByPartenaireAndSearch(Partenaire $partenaire, string $search = null): array { $qb = $this->createQueryBuilder('s') // 核心:只筛选属于当前Partenaire的Structure ->where('s.partenaire = :partenaire') ->setParameter('partenaire', $partenaire) ->orderBy('s.id', 'ASC'); // 保留原有的搜索逻辑 if ($search) { $qb->andWhere('s.Adresse LIKE :search') ->setParameter('search', '%' . $search . '%'); } return $qb->getQuery()->getResult(); }
注:把方法名改成
findByPartenaireAndSearch是为了语义更清晰,你也可以保留原方法名,只要对应修改参数即可。
2. 优化控制器的调用代码
控制器里不需要重复查询Partenaire(路由参数已经自动注入了Partenaire $partenaire),直接调用更新后的Repository方法即可:
// PartenaireController.php #[Route('/{id}', name: 'app_partenaire_show', methods: ['GET', 'POST'])] public function show( Partenaire $partenaire, Request $request, PartenairePermissionRepository $partenairePermissionRepository, StructureRepository $structureRepository ): Response { $getEmail = $this->getUser()->getEmail(); // 传入当前Partenaire和搜索关键词,获取过滤后的结果 $structures = $structureRepository->findByPartenaireAndSearch( $partenaire, $request->query->get('q') ); return $this->render('partenaire/show.html.twig', [ 'partenaire' => $partenaire, 'permission' => $partenairePermissionRepository->findBy(['partenaire' => $partenaire]), 'structures' => $structures, 'email' => $getEmail, ]); }
关键说明
- 通过
where先固定关联Partenaire的条件,再用andWhere叠加搜索条件,实现两者的组合 - 移除了控制器中冗余的
$partenaireId查询,直接使用Symfony的参数注入,代码更简洁高效
内容的提问来源于stack exchange,提问作者Epson184
相关产品推荐
相关产品推荐

