tp5批量更新数据saveAll()

ThinkPHP是国内流行的PHP开发框架之一,对于数据批量更新的问题在Think PHP5的官方文档有说明,但是我估计很多小伙伴看过文档之后可能会存在一点懵逼。因为官方文档讲述数据批量更新采用的是saveAll()的方法。以下是官方文档部分。

ThinkPHP5数据批量更新的问题

文档连接地址:https://www.kancloud.cn/manual/thinkphp5/135189

文档本身没有任何问题,假如我们有一个数据库表表名为“tp_user",其中"tp_"为表前缀。那么我们可以把包含主键的数组通过文档的方法直接批量更新到数据库中。

然而假如有一种情况就是我们的表名没有这么设计,或者我们在一个model中要更新一个特定的数据表的话,那么这个方法就不能直接使用了。否则就会报错。

今天之所以发现这个问题,是因为我在写项目中直接用Db的链式操作update()数组的时候出现了“没有更新数据”的错误后排查时发现的。

发现这一问题后我也百度了一下网上有没有网友遇到同类的问题,其中有部分网友的解决方案是重新封装一个updateAll()的方法。重新封装确实是一种最直接的解决问题的方法。同样的我也弄了个DataService来批量的修改数据,不过既然用了TP框架,我觉得还是最好用官方的方法比较好。经过半个小时研究TP的源代码,找到了最终的解决方法。

这里是think PHP5的方法,估计3.2不太适合。解决方法如下:

我们在任何位置如果想批量对任何一个数据库表执行批量更新的操作,只需要如下两行代码就可以了。

$this->name("数据表名");
$res = $this->saveAll($data);
至于更新最终结果,我们拿$res去判断就可以了。

以上内容就是波波今天遇到的问题及解决方法,希望可以帮助有同样需求的小伙伴。同样的下面是对单条数据更新返回值判断的补充。

我不知道有没有小伙伴写代码类似“$res = Db::name()->where($where)->update($data);”进行单条数据更新的,如果更新的数据和原始数据一样,就是没有改变的前提下,其实$res返回值判断很容易执行到false的逻辑中去。

解决方法:用“===”进行判断。示例如下:

if($res !== false) {
    echo 'success';
}else{
    echo 'false';
}
好了,这篇日记就写这些吧,其实项目中出现问题并不可怕,一步一步排查分析其实所有的问题都很容易解决。

<?php
namespace app\index\controller;
use app\index\model\Staff;

class Index {

  public function index(){

    //创建模型对象
    $model = new Staff;
    
    //创建自定义数据
    $data[] = ['id' => 1010,'name'=>'宋门庆'];
    $data[] = ['id' => 1011,'name'=>'马金莲'];

    //批量更新,自动识别更新和写入
    $result = $model -> saveAll($data,true);

    //反馈执行信息
    echo $result ? '更新成功!<br />' : '更新失败~~<br />' ;

    //查看更新后的信息
    echo '更新后的记录信息:<br />';

    //遍历数据对象数组
    foreach ($result as $list){
      dump($list -> getData());
    }    
  }
}

批量更新

<?php
namespace app\index\controller;
use app\index\model\Staff;

class Index {

  public function index(){

  $dataBefore = Staff::where('name','like','%云%')->select();

  if (!empty($dataBefore)){

      //查看一下更新前的数据对象中的原始数据
      echo '1. 查看一下更新前的数据对象中的原始数据<br />';
      foreach ($dataBefore as $before){
         dump($before->getData());
      }

      //更新数据对象中的原始数据
      foreach ($dataBefore as $list){
         $list -> setAttr('salary','6000');
         $data[] = $list -> getData();
      }

      //用数据对象中的原始数据更新表中对应字段信息
      $dataAfter = (new Staff()) -> saveAll($data);

      if (!empty($dataAfter)){
					echo '更新成功!<br />';
          //查看更新完成后返回的数据对象
          echo '2. 查看一下更新后的数据对象中的原始数据<br />';
          foreach ($dataAfter as $after){
            dump($after->getData());
          }
        }else{
          echo '更新失败!';
        }
  } else {
    echo '没有满足条件的记录!';
  }     
 }
}

输出

1. 查看一下更新前的数据对象中的原始数据
array(6) {
  ["id"] => int(1009)
  ["name"] => string(9) "楚云飞"
  ["sex"] => int(1)
  ["salary"] => float(8100)
  ["dept"] => string(9) "开发部"
  ["hiredate"] => string(10) "2017-01-01"
}
array(6) {
  ["id"] => int(1010)
  ["name"] => string(9) "李云龙"
  ["sex"] => int(1)
  ["salary"] => float(2000)
  ["dept"] => string(9) "开发部"
  ["hiredate"] => string(10) "2017-02-01"
}
更新成功!
2. 查看一下更新后的数据对象中的原始数据
array(6) {
  ["id"] => int(1009)
  ["name"] => string(9) "楚云飞"
  ["sex"] => int(1)
  ["salary"] => string(4) "6000"
  ["dept"] => string(9) "开发部"
  ["hiredate"] => string(10) "2017-01-01"
}
array(6) {
  ["id"] => int(1010)
  ["name"] => string(9) "李云龙"
  ["sex"] => int(1)
  ["salary"] => string(4) "6000"
  ["dept"] => string(9) "开发部"
  ["hiredate"] => string(10) "2017-02-01"
}

作者: 执着小钟

执着小钟

发表评论