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

Laravel中如何更新bookings表e_service字段的嵌套数据?

解决方案

你的问题核心在于e_service(注意你提供的JSON里字段是e_provider,请确认数据库实际字段名)字段存储的是JSON字符串,而非Eloquent关联模型,所以直接通过对象属性访问修改是无效的。以下是两种可行的实现方式:

方式一:利用Eloquent属性转换(推荐)

在Booking模型中配置字段类型转换,让Eloquent自动完成JSON字符串与数组/对象的互转:

// app/Models/Booking.php
class Booking extends Model
{
    protected $casts = [
        // 如果数据库字段是e_provider,这里改成'e_provider' => 'array'
        'e_service' => 'array', 
    ];
}

之后就可以直接操作数组更新字段:

$booking = Booking::find($id);
// 更新数组内的指定字段
$booking->e_service['price'] = $request->price;
$booking->e_service['discount_price'] = $request->discount_price;
$booking->save();

如果配置成'e_service' => 'object',也可以用你最初的写法:

$booking = Booking::find($id);
$booking->e_service->price = $request->price;
$booking->e_service->discount_price = $request->discount_price;
$booking->save();

方式二:手动解析与序列化JSON

如果不想修改模型配置,可以手动处理JSON字符串的解析和编码:

$booking = Booking::find($id);
// 将JSON字符串解析为关联数组(第二个参数true返回数组,否则返回对象)
$eService = json_decode($booking->e_service, true);
// 更新目标字段
$eService['price'] = $request->price;
$eService['discount_price'] = $request->discount_price;
// 重新编码为JSON字符串并赋值
$booking->e_service = json_encode($eService);
$booking->save();

注意事项

  • 请确认数据库中实际字段名是e_service还是e_provider,两种方式中都要对应修改字段名称;
  • 如果使用对象类型转换,确保修改的对象属性能被Eloquent正确捕获并序列化(数组方式更稳妥,避免对象引用问题)。

内容的提问来源于stack exchange,提问作者MD Masum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:24:28