【问题标题】:Split an array to make an insertion of 2100 items in a batch?拆分数组以批量插入 2100 个项目?
【发布时间】:2020-02-28 21:01:01
【问题描述】:

我的 SQL Server 插入限制有问题。当我研究解决方案时,我有两种方法来解决我的问题。第一个是编辑SQL配置文件(但也许我会问我的前辈是否可以更改,因为如果由于我所做的错误SQL配置导致数据库端出现错误,可能会影响客户端)。第二种解决方案很简单,但我不知道是否应该循环执行,或者有一种方法可以在 Laravel/PHP 中使用?

这是我面临的错误:

SQL Server 最多支持 2100 个参数。
SQLSTATE[IMSSP]: 尝试绑定参数号 2101。SQL Server 最多支持 2100 个参数。

这是我制作的示例代码:

$userPermissions = [];

$branchPermissionUser = BranchPermissionUser::get()->where('branch_id', $branchIdFrom)->whereIn('user_id', $userIds);

foreach($userIds as $userId) {
    $permissionIds = $branchPermissionUser->where('user_id', $userId)->pluck('permission_id');

    foreach($permissionIds as $permissionId) {
        $userPermissions[] = [
            'user_id' => $userId,
            'branch_id' => $branchIdTo,
            'permission_id' => $permissionId
        ];
    }
}

BranchPermissionUser::insert($userPermissions);

你会注意到我所做的逻辑是首先我初始化一个空的 $userPermissions 数组,然后每个用户的 $permissionId 是我将推送 $userPermissions。

有一个实例,这个数组长度 ($userPermissions) 将超过 2100。一旦数组长度超过 2100,我将面临 SQL 插入错误。

为了解决这个问题,我在想 Laravel/PHP 中是否有一种方法可以将其作为 By batch of 2100 插入。for 循环是否足以解决这个问题?或者你有什么办法可以解决这个问题?

【问题讨论】:

标签: php sql sql-server laravel optimization


【解决方案1】:
array array_chunk ( array $input , int $size [, bool $preserve_keys = false ] )

检查这个:http://php.net/manual/en/function.array-chunk.php

【讨论】:

    【解决方案2】:

    使用数组

    foreach (array_chunk($userPermissions, 2100) as $userPermission) {
       BranchPermissionUser::insert($userPermission);
    }
    

    使用 Laravel 集合 chunk()

    foreach (collect($userPermissions)->chunk(2100) as $userPermission) {
       BranchPermissionUser::insert($userPermission);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多