thinkphp6数据批量更新

26 篇文章 1 订阅

方法1: 

      $sql="UPDATE $this->table SET ";
        $primarykeyfield="id";
        $updatekeys=array_keys($data[0]);
        $sql.=array_reduce($updatekeys,function($a,$b) use ($data,$primarykeyfield){
          if($b != $primarykeyfield) {
              $cache = $b . "= case " . $primarykeyfield . " ";
              $v = array_reduce($data, function ($c, $d) use ($b, $primarykeyfield) {
                  return $c .= " when " . $d[$primarykeyfield] . " then " . $d[$b];
              }, "");
              if (!empty($v)) {
                  $a .= $cache . $v." end, ";
              }
          }
            return $a;
        }," ");
        $sql=rtrim($sql, ', ');
        $sql.=" where ".$primarykeyfield." IN (".implode(',',array_column($data,$primarykeyfield)).")";

只用什么一个data数组

[['aaa'=>1,'number'=>3,'id'=>2],['aaa'=>2,'number'=>12,'user_id'=>2]]

再修primarykeyfield="主键名称"

执行

Db::execute($sql);

方法2: 

可以例如上面数组在模型里面只需要


$list = [
    ['aaa'=>1,'number'=>3,'id'=>2],
    ['aaa'=>2,'number'=>12,'user_id'=>2,'id'=>3]
];
$this->saveAll($list);

缺点有bug就是如果表没有主键的会报错

还有如果数组只有一条也会报错提交数据不存在:method not exist:think\db\Query->saveAll

我看了哈,有bug但是不想动底层,因为后期框架升级很麻烦,

方法3:

循环使用里面update来更新

$savenumber=0;

foreach($list as $key=>$val){

$id=$val['id'];
unset($val['id']);
$savenumber += $this->where(['id'=>$id])->update($val);

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值