Lavarel ORM更新json字符串的问题

发布于 2022-09-06 13:11:29 字数 1541 浏览 24 评论 0

数据库里有个字段是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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

掩耳倾听 2022-09-13 13:11:29

自己找到方法了,解决了,代码如下。

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

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

另外这个方法会自动把没有变化的字段去掉,只更新有变化的字段,如果待更新的字段全部未变化则不进行Mysql更新操作。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文