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

Symfony/Twig中基于角色渲染数据的问题排查

问题解决方法

核心问题:查询参数类型不匹配

你的代码中,findBy方法传递的rol参数是序列化后的字符串,但数据库中存储的是数组类型(表单选项值为数组),Doctrine查询数组字段时需要直接传入数组而非字符串,这就是查询不到数据的根本原因。

1. 修正控制器查询代码

将控制器里的字符串参数改为数组,同时修正重复的方法名:

/**
 * @Route("/leerling/mededelingen", name="app_leerling")
 */
public function showLeerling(MededelingenRepository $mededelingenRepository) {
    $mededelingen = $mededelingenRepository->findBy(["rol" => ["ROLE_LEERLING"]]);

    return $this->render('leerling/mededelingen.html.twig',
        ['mededelingen' => $mededelingen]
    );
}

/**
 * @Route("/instructeur/mededelingen", name="app_instructeur")
 */
public function showInstructeur(MededelingenRepository $mededelingenRepository) {
    $mededelingen = $mededelingenRepository->findBy(["rol" => ["ROLE_INSTRUCTEUR"]]);

    return $this->render('instructeur/mededelingen.html.twig',
        ['mededelingen' => $mededelingen]
    );
}

2. 优化表单选项显示文本

表单选项的显示文本无需使用数组格式,改为更友好的名称:

$builder->add('rol', ChoiceType::class, [
    'choices'  => [
        '学生' => ["ROLE_LEERLING"],
        '讲师' => ["ROLE_INSTRUCTEUR"],
    ],
]);

3. 规范Twig模板变量名

循环变量使用单数形式更符合语义,避免混淆:

{% for mededeling in mededelingen %}
    <p>{{ mededeling.name }}</p>
{% endfor %}

补充说明

当表单中设置choices的value为数组时,Doctrine的array字段类型会自动将数组序列化为字符串存储,但查询时必须传入原始数组——Doctrine会自动处理序列化匹配逻辑,手动传入序列化字符串会导致查询条件不匹配,无法返回数据。

内容的提问来源于stack exchange,提问作者ProDeveloper69

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:35:29