如何批量更新数据

如何批量更新数据
/**

  • 批量更新

  • @param $tableName

  • @param array $multipleData

  • @return bool

  • /
    public function updateBatch($tableName,$multipleData = [])
    {
    try {
    if (empty($multipleData)) {
    throw new \Exception(“数据不能为空”);
    }
    $firstRow = current($multipleData);

    $updateColumn = array_keys($firstRow);
    // 默认以id为条件更新,如果没有ID则以第一个字段为条件
    $referenceColumn = isset($firstRow[‘id’]) ? ‘id’ : current($updateColumn);
    unset($updateColumn[0]);
    // 拼接sql语句
    $updateSql = “UPDATE “ . $tableName . “ SET “;
    $sets = [];
    $bindings = [];
    foreach ($updateColumn as $uColumn) {
    $setSql = “" . $uColumn . " = CASE “;
    foreach ($multipleData as $data) {
    $setSql .= “WHEN " . $referenceColumn . " = ? THEN ? “;
    $bindings[] = $data[$referenceColumn];
    $bindings[] = $data[$uColumn];
    }
    $setSql .= “ELSE " . $uColumn . " END “;
    $sets[] = $setSql;
    }
    $updateSql .= implode(‘, ‘, $sets);
    $whereIn = collect($multipleData)->pluck($referenceColumn)->values()->all();
    $bindings = array_merge($bindings, $whereIn);
    $whereIn = rtrim(str_repeat(‘?,’, count($whereIn)), ‘,’);
    $updateSql = rtrim($updateSql, “, “) . “ WHERE " . $referenceColumn . " IN (“ . $whereIn . “)”;
    // 传入预处理sql语句和对应绑定数据
    return DB::update($updateSql, $bindings);
    } catch (\Exception $e) {
    return false;
    }
    }

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

SQL会很长,谨慎使用

/**
 * 批量更新
 * @param array $multipleData
 * @param $id
 * @return bool
 */
public function updateBatch ($multipleData = [], $id)
{
   //获取当前元素(第一个)
   $firstRow = current( $multipleData );
   //获取字段
   $updateColumn = array_keys( $firstRow );
   // 拼接sql语句
   $updateSql = 'UPDATE ' . $this->_table . ' SET ';
   $sets      = [];
   foreach ($updateColumn as $uColumn) {
      $setSql = $uColumn . ' = CASE ';
      foreach ($multipleData as $data) {
         $setSql .= ' WHEN ' . $id . ' = ' . $data[$id] . ' THEN ' . $data[$uColumn];
      }
      $setSql .= ' ELSE ' . $uColumn . ' END ';
      $sets[] = $setSql;
   }
   $updateSql .= implode( ', ', $sets );
   $whereIn   = implode( ',', array_column( $multipleData, $id ) );
   $updateSql = rtrim( $updateSql, ', ' ) . ' WHERE ' . $id . ' IN( ' . $whereIn . ' )';
   $this->_db->query( $updateSql );
   $rows = $this->_db->getAffectedRows();
   if (in_array( $rows, [-1, 0] )) {
      return false;
   }
   return $rows;
}
3年前 评论
zz163 (楼主) 3年前
/**
* 批量更新
*/
public function test(){
    //本次更新数据
     $goodsScales = [
        [
        'id' => '商品id',
        'sales' => '销量数',
        ]
    ]
    $goodsIds=array_column($goodsScales,'id');//本次更新数据唯一字段
     $goodsWhen = self::batchUpdate($goodsScales, 'id', ['sales' => '+']);
     Goods::whereIn('id', $goodsIds)->update($goodsWhen);
}


/**
     * 拼接批量更新的sql语句
     *
     * @array $result 数据更新数组
     * @string $whenField 本次更新数据中不重复的数据库字段
     * @array $hierarchys 本次更新数据中需要加减的数组  ['num'=>'-']
     *
     * @return array
     */
    public static function batchUpdate(array $result = [], $whenField = 'id', $hierarchys = [])
    {
        $when = [];
        $update = collect($result);
        foreach ($update->all() as $sets) {
            $whenValue = $sets[$whenField];
            foreach ($sets as $fieldName => $value) {
                if ($fieldName == $whenField) {
                    continue;
                }
                if (is_null($value)) {
                    $value = ' ';
                }
                if (isset($hierarchys[$fieldName])) {
                    $value = $fieldName . $hierarchys[$fieldName] . $value;
                } else {
                    $value = "'" . $value . "'";
                }
                $when[$fieldName][] =
                    "when {$whenField} = '{$whenValue}' then " . $value;
            }
        }
        foreach ($when as $fieldName => &$item) {
            $item = DB::raw("case " . implode(' ', $item) . ' end ');
        }
        return $when;
    }
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
0
喜欢
0
收藏
2
排名:1941
访问:1063
私信
所有博文
社区赞助商