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

Laravel Blade:在old()函数中拼接变量字符串的问题

解决双层foreach循环中使用old()函数的问题

我之前也踩过这个坑,在Laravel里用双层循环生成复选框时,直接拼接字符串给old()函数经常会出现不生效的情况。这里给你两种靠谱的解决方案,以及需要注意的细节:

问题根源

通常我们会给复选框的name设置成数组格式,比如slots[{{ $day_key }}][{{ $period_key }}],但用字符串拼接作为old()的参数时,有时候因为变量解析、数组路径识别的问题,导致无法正确获取旧值。

方案1:正确拼接字符串参数

如果坚持用字符串形式,要确保变量在字符串里被正确解析,两种写法都可行:

  • 双引号直接解析变量:
    <input type="checkbox" 
           name="slots[{{ $day_key }}][{{ $period_key }}]" 
           value="1" 
           {{ old("slots[$day_key][$period_key]") ? 'checked' : '' }}>
    
  • 单引号手动拼接:
    <input type="checkbox" 
           name="slots[{{ $day_key }}][{{ $period_key }}]" 
           value="1" 
           {{ old('slots[' . $day_key . '][' . $period_key . ']') ? 'checked' : '' }}>
    

Laravel的old()函数能识别这种数组路径格式的字符串,只要你的表单name和参数完全对应就没问题。

方案2:用数组参数传递(更可靠)

我个人更推荐这种方式,完全避免字符串拼接的坑——old()函数支持直接传入数组来指定层级:

<input type="checkbox" 
       name="slots[{{ $day_key }}][{{ $period_key }}]" 
       value="1" 
       {{ old(['slots', $day_key, $period_key]) ? 'checked' : '' }}>

把数组的每一层作为数组元素传给old(),Laravel会自动帮你找到对应的旧值,不管$day_key和$period_key是数字还是字符串,都能完美适配。

关键注意事项

  • 确保表单是POST方法,并且加了@csrf指令,不然闪存数据根本不会生效;
  • 控制器里验证失败时,Laravel会自动调用withInput(),但如果你是手动重定向,一定要加上->withInput(),比如:
    return redirect()->back()->withInput();
    
  • 如果复选框的value不是"1",要调整判断逻辑,比如value是$period_key的话,就得写成{{ old(...) == $period_key ? 'checked' : '' }}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:55:40