为了账号安全,请及时绑定邮箱和手机立即绑定

Lavarel ORM更新json字符串的问题

Lavarel ORM更新json字符串的问题

PHP
白猪掌柜的 2019-03-08 05:37:11
数据库里有个字段是text类型,存放的是json数据。 表Model操作类 class RecordModel extends Illuminate\Database\Eloquent\Model { /** * table * * @var string */ protected $table = 'records'; /** * primaryKey * * @var string */ protected $primaryKey = 'id'; /** * guarded * * @var mixed */ protected $guarded = array(); /** * getExtraAttribute * * @param mixed $value * @return void */ public function getExtraAttribute($value) { return json_decode($value); } /** * setExtraAttribute * * @param mixed $value * @return void */ public function setExtraAttribute($value) { $this->attributes['extra'] = json_encode($value); } } 业务逻辑代码 // $id 是用户输入进来的参数 $service = new RecordModel(); if ($service->where('id', $id)->exists()) { // 存在记录,更新 $data = array( 'extra' => json_encode($extra), ); $service->where('id', $id)->update($data); } else { // 不存在记录,新增 $service->id = $id; $service->extra = $extra; $service->save(); } 我看了Lavarel ORM里Model类的代码,新增逻辑会触发Model里的__set方法,进而触发setAttribute方法自动将extra字段的值进行json_encode处理。 但是存在记录的情况下,$service->where('id', $id)返回的是一个Illuminate\Database\Eloquent\Builder实例,它的update方法并不会自动进行json_encode处理。 这里有办法可以让update操作的时候也自动进行json_encode处理吗?
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

自己找到方法了,解决了,代码如下。

$conditions = array(
    'id' => $id
);

$extra = array(
...
);
  
$service = RecordModel::firstOrNew($conditions);
$service->extra = $extra;    
$service->save();

另外这个方法会自动把没有变化的字段去掉,只更新有变化的字段,如果待更新的字段全部未变化则不进行Mysql更新操作。

查看完整回答
反对 回复 2019-03-18
  • 1 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信