Symfony与Twig循环匹配问题求助
解决Twig中循环匹配关联实体的统计问题
问题根源分析
你当前的代码里,likes|keys获取的是likes数组的索引键(比如0、1这类数字),而不是每个like对象关联的comunidad.id。这就导致只有当comunidad.id刚好等于数组索引时才会显示OK(比如你输出里的最后一条,comunidad.id=1刚好在[0,1]这个索引数组里),这完全是巧合,根本没实现你要的“匹配已点赞的社区”的逻辑。
修正方案
我们需要先把likes数组转换成只包含comunidad.id的数组,再用这个数组做匹配判断。这里可以用Twig的map过滤器来实现:
优化后的Twig代码
{% if comunidades %} {# 先预处理:把所有已点赞的社区ID提取成数组,只做一次处理更高效 #} {% set likedComunidadIds = likes|map(like => like.comunidad.id) %} {% for comunidad in comunidades %} {# 调试用:可以输出当前社区ID和已点赞ID数组,确认数据 #} {{ likedComunidadIds|join(',') }} --{{ comunidad.id }}-- {# 正确的匹配判断 #} {% if comunidad.id in likedComunidadIds %} OK {% endif %} <br> {# 换行方便查看结果 #} {% endfor %} {% endif %}
代码解释
likedComunidadIds变量:用map过滤器遍历likes数组,把每个like对象的comunidad.id提取出来,生成一个纯ID数组(比如你的例子里会变成[1,3])。- 匹配判断:直接用
comunidad.id in likedComunidadIds,就能准确判断当前社区是否被点赞过。
额外优化建议
如果你的likes数据量比较大,建议在Symfony Controller里提前处理好这个ID数组,再传递给Twig模板,这样比在Twig里用过滤器处理性能更好:
// 在Controller中 $likes = $yourLikeRepository->findAll(); $likedComunidadIds = array_map(function($like) { return $like->getComunidad()->getId(); }, $likes); // 把$likedComunidadIds传到模板 return $this->render('your_template.html.twig', [ 'comunidades' => $comunidades, 'likedComunidadIds' => $likedComunidadIds, ]);
然后Twig里直接用{% if comunidad.id in likedComunidadIds %}即可,逻辑更简洁。
内容的提问来源于stack exchange,提问作者DAVID It's me
相关产品推荐
相关产品推荐

