You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 %}

代码解释

  1. likedComunidadIds变量:用map过滤器遍历likes数组,把每个like对象的comunidad.id提取出来,生成一个纯ID数组(比如你的例子里会变成[1,3])。
  2. 匹配判断:直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:13:00