欢迎访问永胜空间,好运加身,财源广进不是梦

thinkPHP8在有数据更新时保存的方法

  • 工作心得 @
  • 作者:顾永胜
  • 来源:0513.city

如果在thinkPHP8中获取前端数据的时候会忽略掉数据类型,如果前端传来数值型的0,在后端就会接收成字符“0”,这时候使用Model去save就会触发数据库保存。但其实执行这一次数据保存是多余的,只是把重复数据又保存了一次。


数据保存时,接收数据可以这样接收:

$data = json_decode($this->request->getContent(), true);

这样得到的数据就会被转换成带数据类型的格式了。


还有一个情况是使用了自动更新时间数据戳,这样每次保存即使其他数据没变,也会去更新时间,这也是一个多余的更新。


在这里我们可以先给$model->data($data),把数据加上去,然后比较:

if (!empty($model->getChangedData())) {

    $model->save();

}

这里还要注意的一点,$data这个数据不能包含数据库之外的字段,有果有其他数据$model->getChangedData()必定返回true。


第一个方法是在$model->data($data)之前把不需要的数据移除掉。


第二个方法是在自定义的Model文件中设置,如下所示:

protected $readonly = ['id','__token__'];

我的$data中包含了token字段,这是一个不会存入数据库的字段,在$readonly中加入,在$model->getChangedData()的时候就不会考虑token这个字段了。


这样就可以放心的点保存按钮玩了。