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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:15:42