數據庫里有個字段是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更新操作。
- 1 回答
- 0 關注
- 410 瀏覽
添加回答
舉報
0/150
提交
取消