数据库里有个字段是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 关注
- 395 浏览
添加回答
举报
0/150
提交
取消