Symfony 6.1.12中能否返回数组而非PersistentCollection?
解决Lessons实体关联返回PersistentCollection的问题
方法一:在Lessons实体中添加获取当前翻译的方法
你的查询已经按locale过滤了翻译,每个Lessons实例的lessonTranslation集合里只会有一个匹配的翻译。直接在实体里加一个方法,快速返回对应locale的翻译实例:
// 在App\Entity\Lessons类中添加 public function getCurrentTranslation(string $locale): ?LessonsTranslation { // 遍历集合找对应locale的翻译 foreach ($this->lessonTranslation as $translation) { if ($translation->getLocale() === $locale) { return $translation; } } return null; }
之后在Twig模板里就能直接调用:
{{ lesson.getCurrentTranslation(app.request.locale).title }}
如果想提升效率,可以在实体里缓存结果,避免重复遍历:
// 在Lessons类中添加私有属性 private ?LessonsTranslation $currentTranslation = null; public function getCurrentTranslation(string $locale): ?LessonsTranslation { if ($this->currentTranslation instanceof LessonsTranslation && $this->currentTranslation->getLocale() === $locale) { return $this->currentTranslation; } foreach ($this->lessonTranslation as $translation) { if ($translation->getLocale() === $locale) { $this->currentTranslation = $translation; return $translation; } } return null; }
方法二:修改查询返回数组而非实体
如果不需要实体对象,只需要纯数据,可以修改查询的 hydration 模式为数组:
return $this->getEntityManager()->createQueryBuilder() // ... 原查询代码不变 ->getQuery() ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); // 新增数组hydration配置
返回的结果是纯数组结构,lessonTranslation会变成包含单个元素的数组,Twig里可以这样访问:
{{ lesson.lessonTranslation[0].title }}
方法三:在控制器中预处理结果
在控制器里遍历查询结果,把匹配的翻译直接绑定到Lessons实例的临时属性上:
首先在Lessons实体中添加临时属性和setter:
// 在App\Entity\Lessons类中 private ?LessonsTranslation $currentTranslation = null; public function setCurrentTranslation(?LessonsTranslation $currentTranslation): self { $this->currentTranslation = $currentTranslation; return $this; } public function getCurrentTranslation(): ?LessonsTranslation { return $this->currentTranslation; }
然后在控制器中处理结果:
$lessons = // 原查询结果 $locale = $this->getParameter('locale'); // 或从Request对象获取当前locale foreach ($lessons as $lesson) { // 从集合中过滤出对应locale的翻译 $translation = $lesson->getLessonTranslation() ->filter(fn(LessonsTranslation $t) => $t->getLocale() === $locale) ->first(); $lesson->setCurrentTranslation($translation); } return $this->render('your_template.html.twig', [ 'lessons' => $lessons, ]);
之后Twig里直接访问:
{{ lesson.currentTranslation.title }}
内容的提问来源于stack exchange,提问作者ais
相关产品推荐
相关产品推荐

