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
相关产品推荐
相关产品推荐

