Laravel 5.5 多选表单数据存库数组转字符串报错解决
问题根源
implode()是返回值型函数,不会修改传入的原数组:你要么只把转换结果赋值给独立变量没替换$data内的原字段,要么直接调用函数不接收返回值,两种写法都不会改变$data['description']的数组类型,更新时传参还是数组,自然触发array to string conversion报错- 代码存在变量混用错误:控制器方法通过路由模型绑定注入了
Combos $product实例,更新时却调用了未定义的$user变量,会额外抛出变量未定义异常 - 验证规则未声明
description为数组类型,遇到异常提交格式时不会主动拦截
修复方案
1. 完善验证规则
先给description加上数组类型校验,同时可以追加子元素校验,确保每个选中值都是合法的产品名:
'description' => 'required|array', 'description.*' => 'string|exists:productos,name', // 校验每个值都存在于产品表name字段,拦截非法提交
2. 转换格式后覆盖原数组字段
用你需要的分隔符拼接数组后,直接把结果赋值给$data['description'],替换原来的数组值。分隔符推荐用逗号、竖线这类不会出现在产品名中的特殊符号,后续编辑回显时方便拆分。
3. 修正更新逻辑的变量错误
既然已经通过路由模型绑定拿到了对应ID的Combos实例,不需要额外调用where('id', ...)查询,直接调用实例的update方法即可,删除不存在的$user变量调用。
最终可用代码
控制器update方法
public function update(Combos $product){ $data = request()->validate([ 'name' => 'required|string|min:8|max:100', 'id' => 'required', 'description' =>'required|array', 'description.*' => 'string|exists:productos,name', ]); // 转换数组为逗号分隔字符串,覆盖原数组值 $data['description'] = implode(",", $data['description']); // 直接使用绑定的模型实例更新 $product->update($data); return view('Combos')->with('combos', Combos::all()) ->with('products', Products::all()); }
编辑页回显适配
因为数据库中存储的是逗号分隔的字符串,编辑套餐需要回显选中状态时,先把字符串拆回数组再判断选中即可,注意循环产品时不要和注入的$product变量重名:
<div class="form-group" id="selector"> <label for="">Products</label> <select multiple="multiple" class="form-control" name="description[]" > <option value="" disabled>Select product</option> @php $selected = explode(",", $product->description); @endphp @foreach ($products as $item) <option value="{{$item->name}}" {{ in_array($item->name, $selected) ? 'selected' : '' }}>{{$item->name}}</option> @endforeach </select> </div>
注意:如果产品名本身可能包含逗号,换用其他不会出现的分隔符(如
|)即可,逻辑保持一致。
内容的提问来源于stack exchange,提问作者Miguel David
相关产品推荐
相关产品推荐

