Laravel 数据库批量更新的问题,请大家帮我看看!感谢!

我在 laravel 中遇到了需要循环更新数据的情况,应该怎么一次性请求完,提高性能呢?

我之前使用过 laravel 批量插入的功能,如下:

ComDecLoan::insert($com_dec_loan_arr);

是数据库模型使用 insert 来批量导入一个数组

批量更新是否也有同样的操作呢?请大家指点我一下,非常感谢!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

可以使用case when拼接来批量更新

3年前 评论
HEPING (楼主) 3年前
 public static function updateBatch(array $attributes = [])
    {
        try {
            $tableName = self::TABLE;
            $firstRow = current($attributes);
            $columns = array_keys($firstRow);

            $referenceColumn = isset($firstRow['id']) ? 'id' : current($columns);
            unset($columns[0]);
            // 拼接sql语句
            $updateSql = "UPDATE ".$tableName." SET ";
            $sets = [];
            $bindings = [];
            foreach ($columns as $column) {
                $setSql = "`".$column."` = CASE ";
                foreach ($attributes as $data) {
                    $setSql .= "WHEN `".$referenceColumn."` = ? THEN ? ";
                    $bindings[] = $data[$referenceColumn];
                    $bindings[] = $data[$column];
                }
                $setSql .= "ELSE `".$column."` END ";
                $sets[] = $setSql;
            }
            $updateSql .= implode(', ', $sets);
            $whereIn = collect($attributes)->pluck($referenceColumn)->values()->all();
            $bindings = array_merge($bindings, $whereIn);
            $whereIn = rtrim(str_repeat('?,', count($whereIn)), ',');
            $updateSql = rtrim($updateSql, ", ")." WHERE `".$referenceColumn."` IN (".$whereIn.")";

            return DB::update($updateSql, $bindings);
        } catch (\Exception $exception) {
            return false;
        }
    }

使用示例

$lists = [];
$lists[] = [
  'id'=>1,
  'name'=>'test',  
];

ProductItem::updateBatch($lists);
3年前 评论
HEPING (楼主) 3年前
HEPING (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!