ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[danger]data($data) 这个方法Model和Query都存在,分别返回自己所在的类对象即$this >Model和Query都有setInc/setDec方法,用于字段自增自减,用法也一样 >允许字段Model是allowField(['name','email']); Query是field(['name','email'],false) ## **Query** ### **更新一条数据** update: 方法返回影响数据的条数,没修改任何数据返回 0 ~~~ Db::table('think_user')->where('id', 1)->update(['name' => 'thinkphp']); //同 Db::table('think_user')->update(['name' => 'thinkphp','id'=>1]); ~~~ ### **更新某个字段的值:** setField: 方法返回影响数据的条数,没修改任何数据字段返回 0 ~~~ Db::table('think_user')->where('id',1)->setField('name', 'thinkphp'); ~~~ ### **自增或自减一个字段的值** setInc/setDec 方法返回影响数据的条数 对应链式操作方法为inc/dec ~~~ // 默认score 字段加 1 Db::table('think_user')->where('id', 1)->setInc('score'); // score 字段加 5 Db::table('think_user')->where('id', 1)->setInc('score', 5); // 默认score 字段减 1 Db::table('think_user')->where('id', 1)->setDec('score'); // score 字段减 5 Db::table('think_user')->where('id', 1)->setDec('score', 5); //setInc/setDec支持延时更新,如果需要延时更新则传入第三个参数 //例:延时10秒,给`score`字段增加1 Db::table('think_user')->where('id', 1)->setInc('score', 1, 10); ~~~ 如果要更新的数据需要使用`SQL`函数或者其它字段,可以使用下面的方式: 对应链式操作方法为exp ~~~ Db::table('think_user') ->where('id', 1) ->update([ 'login_time' => Db::raw('now()'), 'login_times' => Db::raw('login_times+1'), ]); 已废弃的: Db::table('think_user') ->where('id', 1) ->update([ 'login_time' => ['exp','now()'], 'login_times' => ['exp','login_times+1'], ]); ~~~ 上面的方法被有被封装为链式辅助操作方法这样就可以连续调用 ~~~ Db::table('data') ->where('id',1) ->inc('read')// read字段自增1 ->dec('score',3)//score字段自减3 ->exp('name','UPPER(name)')//对name字段使用函数UPPER使其首字母大写 ->update(); ~~~ ## **Model** 相比Query更新,多了模型的事件功能 注意不要在一个模型实例里面做多次更新,会导致部分重复数据不再更新,正确的方式应该是先查询后更新或者使用模型类的`update`方法更新。 >[danger] 如果你调用save方法进行多次数据写入的时候,需要注意,第二次save方法的时候必须使用isUpdate(false),否则会视为更新数据。 ### **更新一条数据** ~~~ save方法新增数据返回的是受影响的行数。 //## 查找并更新 $user = User::get(1); $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; $user->save(); // 直接更新数据 $user = new User; // save方法第二个参数为更新条件 $user->save([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com' ],['id' => 1]); //如果想把主键放到一起,需要isUpdate() $items=new \app\index\model\Banner(); $items->isUpdate()->save(['des'=>'广告位xxx轮播','id'=>8]); //静态方法::update 返回Model 他是isUpdate(true)和save(0的结合体 \app\index\model\User::update(['id' => 1, 'name' => 'thinkphp']); // 闭包更新 $user = new User; $user->save(['name' => 'thinkphp'],function($query){ // 更新status值为1 并且id大于10的数据 $query->where('status', 1)->where('id', '>', 10); }); ~~~ 直接更新$_POST的操作 ~~~ $user = new User(); // 过滤post数组中的非数据表字段数据 $user->allowField(true)->save($_POST,['id' => 1]); 如果你通过外部提交赋值给模型,并且希望指定某些字段写入,可以使用: $user = new User(); // post数组中只有name和email字段会写入 $user->allowField(['name','email'])->save($_POST, ['id' => 1]); ~~~ ### **Model自增或自减一个字段的值** setInc/setDec 方法返回影响数据的条数 ~~~ // 默认score 字段加 1 User::get(1)->setInc('score'); // score 字段加 5 User::get(1)->setInc('score', 5); // 默认score 字段减 1 User::get(1)->setDec('score'); // score 字段减 5 User::get(1)->setDec('score', 5); //setInc/setDec支持延时更新,如果需要延时更新则传入第三个参数 //例:延时10秒,给`score`字段增加1 User::get(1)->setInc('score', 1, 10); ~~~ ### **批量更新多条数据** 更新数据中必须带有主键,否则请使用`foreach`遍历更新。 saveAll方法更新数据返回的是更新后的数据集(或数组)。更具`'resultset_type' => 'collection',`配置返回数据集还是数组 saveAll不支持data()方法 ~~~ $user = new User; $list = [ ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'] ]; $user->saveAll($list); //由于Model的save()与saveAll()方法既可以新增也可以修改,都是 自动识别是否为新增和更新 //如果业务复杂可以直接使用isUpdate()强制执行更新操作默认isUpdate(true) $user->isUpdate(true)->saveAll($list); ~~~