如何在Laravel中将多选框数据以JSON格式保存到数据库
实现方案
1. 修改Blade视图代码
将原多选框的name改为services[],并把选项的value设置为包含服务ID和价格的JSON字符串,确保提交时能同时传递两个字段:
<div class="form-group"> <label for="service_id">Services *</label> <select class="select2" multiple="multiple" name="services[]" required data-placeholder="Select Services" style="width: 100%;"> @foreach($services as $service) <option value="{{ json_encode(['id' => $service->services_id, 'price' => $service->services_price]) }}"> {{ $service->services_name }} </option> @endforeach </select> </div>
2. 更新Controller验证与处理逻辑
- 调整验证规则,将原
service_id的验证替换为services数组验证 - 解析提交的JSON字符串,组装成
服务ID => 服务价格的关联数组 - 将组装后的数组转为JSON格式,存入数据库
public function store(Request $req) { // 表单验证 $this->validate(request(), [ 'customer_id' => 'required', 'services' => 'required|array', 'offer_score' => 'required', 'tag_id' => 'required', ]); // 组装服务ID与价格的映射数组 $serviceMap = []; foreach ($req->services as $serviceJson) { $serviceData = json_decode($serviceJson, true); $serviceMap[$serviceData['id']] = $serviceData['price']; } $offers = new Offers; $offers->service_id = json_encode($serviceMap); // 保存为JSON格式 $offers->offer_status = $req->offer_status; $offers->customer_id = $req->customer_id; $offers->offer_score = $req->offer_score; $offers->tag_id = $req->tag_id; $offers->offer_discount = $req->offer_discount; $offers->offer_reminder_date = $req->offer_reminder_date; $offers->user_company_id = $req->user_company_id; $offers->user_id = $req->user_id; $offers->save(); return redirect()->back()->with('success', true); }
3. 数据库字段调整
确保offers表中的service_id字段类型为JSON(推荐)或TEXT。如果使用MySQL,直接修改字段类型为json即可,Laravel会自动处理JSON的序列化与反序列化。
可选优化:模型属性自动转换
如果希望读取数据库时自动将JSON转为数组,可以在Offers模型中添加属性转换配置:
class Offers extends Model { protected $casts = [ 'service_id' => 'array', ]; }
配置后,存入数据时Laravel会自动将数组转为JSON,读取时自动转回数组,无需手动调用json_encode和json_decode。
内容的提问来源于stack exchange,提问作者Emre Kd
相关产品推荐
相关产品推荐

