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处理吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
自己找到方法了,解决了,代码如下。
另外这个方法会自动把没有变化的字段去掉,只更新有变化的字段,如果待更新的字段全部未变化则不进行Mysql更新操作。