Разделить массив, чтобы сделать вставку из 2100 элементов в пакете? - PullRequest
1 голос
/ 03 ноября 2019

У меня проблема с лимитом вставки SQL Server. Пока я ищу решение, у меня есть 2 способа решить мою проблему. Первый - отредактировать файл конфигурации 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, а затем каждый $missionId пользователя - я буду нажимать на $ userPermissions.

Существует случай, когда длина этого массива ($ userPermissions) будет больше 2100. И как только длина массива превысит 2100, я сталкиваюсь с ошибкой при вставке SQL.

Чтобы исправить это, я думаю, есть ли способ в Laravel / PHP, чтобы я мог вставить его в виде пакета By 2100. Является ли цикл for достаточным для решения этой проблемы? Или у вас есть какой-нибудь способ решить эту проблему?

Ответы [ 2 ]

5 голосов
/ 03 ноября 2019
array array_chunk ( array $input , int $size [, bool $preserve_keys = false ] )

Проверьте это: http://php.net/manual/en/function.array-chunk.php

2 голосов
/ 03 ноября 2019

Использование массивов

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

Использование Коллекций Laravel chunk ()

foreach (collect($userPermissions)->chunk(2100) as $userPermission) {
   BranchPermissionUser::insert($userPermission);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...