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
相关产品推荐
相关产品推荐

