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处理吗?

白猪掌柜的
浏览 396回答 1
1回答

不负相思意

自己找到方法了,解决了,代码如下。 $conditions = array( 'id' => $id ); $extra = array( ... ); $service = RecordModel::firstOrNew($conditions); $service->extra = $extra; $service->save(); 另外这个方法会自动把没有变化的字段去掉,只更新有变化的字段,如果待更新的字段全部未变化则不进行Mysql更新操作。
打开App,查看更多内容
随时随地看视频慕课网APP