Lavarel ORM更新json字符串的问题

数据库里有个字段是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处理吗?

阅读 2k
1 个回答

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题