ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] >[info] 更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件或者不查询直接更新,直接使用静态的`Update`方法进行条件更新,如非必要,尽量不要使用批量更新。 # **查找并更新:save** 在取出数据后,更改字段内容后使用`save`方法更新数据。**这种方式是最佳的更新方式**。 ~~~ $user = User::find(1); 或者: $user = User::where('status',1) ->where('name','dash') ->find(); $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; //成功返回true $user->save(); //过滤: post数组中只有name和email字段会写入 $user->allowField(['name', 'email'])->save($_POST); //save方法更新数据,只会更新变化的数据,对于没有变化的数据是不会进行重新更新的。如果你需要强制更新数据,可以使用force() //以前版本是isUpdate(true)方法但是这个方法在tp6被移除了 $user->force()->save(); ~~~ 如果要执行SQL函数更新,可以使用下面的方法 ~~~ $user = User::find(1); $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; $user->score = Db::raw('score+1'); $user->save(); ~~~ >[danger]save方法现在只能先查询后更新,不支持条件更新了例如tp5中`$user->save([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com' ],['id' => 1]);`这种方法就不再支持 # **批量更新数据saveAll** 可以使用`saveAll`方法批量更新数据,只需要在批量更新的数据中包含主键即可,例如: ~~~ $user = new User; $list = [ ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'] ]; $user->saveAll($list); ~~~ 批量更新方法返回的是一个数据集对象。 >[danger] 批量更新仅能根据主键值进行更新,其它情况请自行处理。 # **直接更新 :update(静态方法)** ~~~ //返回模型的对象实例 User::update(['name' => 'thinkphp'], ['id' => 1]); ~~~ # **自动识别** 我们已经看到,模型的新增和更新方法都是`save`方法,系统有一套默认的规则来识别当前的数据需要更新还是新增。 * 实例化模型后调用`save`方法表示新增;如果new model后用save修改汇报`Integrity constraint violation: 1062 Duplicate entry '3' for key 'PRIMARY'`错误 * 查询数据后调用`save`方法表示更新; 不要在一个模型实例里面做多次更新,会导致部分重复数据不再更新,正确的方式应该是先查询后更新或者使用模型类的`update`方法更新。 >[danger] 不要调用`save`方法进行多次数据写入。