如何将多选框多值存入数据库同一字段?仅最后一个值被保存
解决多选框值仅保存最后一个的问题
我看了你的代码,问题出在控制器的循环逻辑里——你在foreach循环中每次都用当前的$data覆盖$ltjob->workdone的值,所以循环结束后,自然只剩下最后一个选中的选项值。咱们来改改代码,把所有选中的值都存进去:
方法1:存为逗号分隔的字符串
如果你的数据库workdone字段是varchar或text类型,可以把选中的数组转成逗号分隔的字符串存储:
修改控制器的store方法,去掉循环,直接用implode处理数组:
public function store(Request $request) { $this->validate($request, array( 'staff' => 'nullable', 'dmc' => 'nullable', 'workdone' => 'nullable', 'product_id' => 'nullable' )); $ltjob = new Ltjob; $ltjob->staff = $request->staff; $ltjob->dmc = $request->dmc; $ltjob->product_id = $request->product_id; // 把数组转成逗号分隔的字符串,空数组时返回空字符串 $ltjob->workdone = implode(',', $request->input('data', [])); $ltjob->save(); return redirect()->route('ltjobs.create'); }
这样存储后,workdone字段的值会是类似00101,00102,00104的格式,后续读取时可以用explode(',', $ltjob->workdone)转成数组使用。
方法2:存为JSON格式(推荐)
如果你的数据库支持JSON类型(比如MySQL 5.7+、PostgreSQL),可以直接把数组存为JSON,Laravel会自动处理序列化和反序列化:
首先确保ltjobs表的workdone字段类型是json或jsonb,然后修改代码:
public function store(Request $request) { $this->validate($request, array( 'staff' => 'nullable', 'dmc' => 'nullable', 'workdone' => 'nullable', 'product_id' => 'nullable' )); $ltjob = new Ltjob; $ltjob->staff = $request->staff; $ltjob->dmc = $request->dmc; $ltjob->product_id = $request->product_id; // 直接赋值数组,Laravel会自动转成JSON存储 $ltjob->workdone = $request->input('data', []); $ltjob->save(); return redirect()->route('ltjobs.create'); }
这种方法的好处是,后续从数据库读取workdone时,Laravel会自动把它转成PHP数组,不需要手动处理字符串拆分,使用起来更方便。
内容的提问来源于stack exchange,提问作者Ali Özen
相关产品推荐
相关产品推荐

