鍍金池/ 問答/PHP  數(shù)據(jù)庫  網(wǎng)絡(luò)安全/ Lavarel ORM更新json字符串的問題

Lavarel ORM更新json字符串的問題

數(shù)據(jù)庫里有個(gè)字段是text類型,存放的是json數(shù)據(jù)。

表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);
    }
}  

業(yè)務(wù)邏輯代碼

// $id 是用戶輸入進(jìn)來的參數(shù)

$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類的代碼,新增邏輯會(huì)觸發(fā)Model里的__set方法,進(jìn)而觸發(fā)setAttribute方法自動(dòng)將extra字段的值進(jìn)行json_encode處理。

但是存在記錄的情況下,$service->where('id', $id)返回的是一個(gè)Illuminate\Database\Eloquent\Builder實(shí)例,它的update方法并不會(huì)自動(dòng)進(jìn)行json_encode處理。

這里有辦法可以讓update操作的時(shí)候也自動(dòng)進(jìn)行json_encode處理嗎?

回答
編輯回答
賤人曾

自己找到方法了,解決了,代碼如下。

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

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

另外這個(gè)方法會(huì)自動(dòng)把沒有變化的字段去掉,只更新有變化的字段,如果待更新的字段全部未變化則不進(jìn)行Mysql更新操作。

2017年1月4日 22:42