CakePHP 4.x: ошибка array_combine() при сохранении вложенных ассоциацийPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 CakePHP 4.x: ошибка array_combine() при сохранении вложенных ассоциаций

Сообщение Anonymous »


Привет, сообщество Stack Overflow!

Я работаю с CakePHP 4.x и столкнулся с проблемой при попытке сохранить вложенные ассоциации. Мое приложение обрабатывает заказы, каждый из которых содержит OrderItems, и каждый OrderItem может иметь несколько OrderItemOptions. Я использую методы newEntity() для создания этих объектов. Однако когда я пытаюсь сохранить объект Order, содержащий OrderItems с их OrderItemOptions, я сталкиваюсь с ошибкой ValueError, связанной с array_combine().

Я получаю сообщение об ошибке

[ValueError] array_combine(): аргумент №1 ($keys) и аргумент №2 ($values) должны иметь одинаковое количество элементов. Упрощенные объекты API: Объект с тремя вариантами

"поля": [ { «field_id»: 2, "field_name": "Размер", «тип_поля»: 0, «string_value»: ноль, «date_value»: ноль, «file_value_url»: ноль, "параметры": [ { «option_id»: 1, «кол-во»: 50, "код": "S", "имя": "Маленький", "sub_options": [], "артикул": "STSU822C0081S", «vendor_sku»: ноль, "dn_sku_id": "246924061_392440381" }, { «option_id»: 2, «кол-во»: 50, "код": "М", "name": "Средний", "sub_options": [], "артикул": "STSU822C0081M", «vendor_sku»: ноль, "dn_sku_id": "246924061_392439396" }, { «option_id»: 4, «кол-во»: 50, "код": "XL", "name": "X Большой", "sub_options": [], "артикул": "STSU822C0081X", «vendor_sku»: ноль, "dn_sku_id": "246924061_392439371" } ] }, { "field_id": 830881, "field_name": "Позиция", «тип_поля»: 2, «string_value»: ноль, «date_value»: ноль, «file_value_url»: ноль, "параметры": [] }, { "field_id": 822656, "field_name": "Позиция напитка", «тип_поля»: 2, «string_value»: ноль, «date_value»: ноль, «file_value_url»: ноль, "параметры": [] } ], Объект без каких-либо параметров

"поля": [] Объект с 1 вариантом

"поля": [ { «field_id»: 2, "field_name": "Размер", «тип_поля»: 0, «string_value»: ноль, «date_value»: ноль, «file_value_url»: ноль, "параметры": [ { «option_id»: 6214601, «кол-во»: 150, "код": "100er", "name": "100er", "sub_options": [], "артикул": "СБМУ-С13", «vendor_sku»: ноль, "dn_sku_id": "247765931_394789266" } ] }, { "field_id": 830881, "field_name": "Позиция", «тип_поля»: 2, «string_value»: ноль, «date_value»: ноль, «file_value_url»: ноль, "параметры": [] }, { "field_id": 822656, "field_name": "Позиция напитка", «тип_поля»: 2, «string_value»: ноль, «date_value»: ноль, «file_value_url»: ноль, "параметры": [] } ], Вот упрощенная версия моего кода: Таблица заказов

публичная функция saveOrders(массив $orders): bool { $newOrders = []; $defaultShippingService = $this->ShippingServices->find('all', [ 'условия' => [ 'is_default' => правда, 'опубликовано' => правда, ], ])->первый(); foreach ($orders['orders'] as $order) { $existingOrder = $this->find()->where(['order_id' => $order['order_id']])->first(); если (!$existingOrder) { $assignedUser = $this->Users->find()->where(['deconetwork_user_id' => $order['assigned_to']['id']])->first(); если ($assignedUser) { $company = $order['shipping_details']['company'] ?? $order['billing_details']['компания'] ?? нулевой; $details = $order['shipping_details'] ?? $order['billing_details']; $address = Trim($details['улица']); $firstName = Trim($details['firstname']); $lastName = Trim($details['lastname']); $street = Trim($details['street']); $postcode = Trim($details['postcode']); $city = Trim($details['city']); $countryCode = Trim($details['country_code']); $state = Trim($details['state']); $email = $details['custom_fields']; если ($компания) { если (strlen($company) splitCompanyName($company); } } еще { $company_name1 = $firstName. ' ' . $ ПоследнееИмя; $company_name2 = ноль; } $addressParts = $this->splitAddress($street); $orderEntity = $this->newEntity([ 'user_id' => $assignedUser->id, 'order_id' => $order['order_id'], 'customer_id' => $order['customer_id'], 'shipping_service_id' => $defaultShippingService? $defaultShippingService->id: ноль, 'компания' => $компания, 'имя_компании1' => $имя_компании1, 'имя_компании2' => $имя_компании2, 'customer_reference_number1' => $order['order_id'], 'firstname' => $firstName, 'фамилия' => $lastName, 'адрес' => $адрес, 'улица' => $addressParts['улица'], 'house_no' => $addressParts['house_no'], 'почтовый индекс' => $почтовый индекс, 'город' => $город, 'country_code' => $countryCode, 'состояние' => $состояние, 'email' => $this->getCustomerMail((array)$email), 'date_produced' => новое FrozenTime($order['date_produced']), 'order_items' => [], ]); foreach ($order['order_lines'] как $orderItem) { $orderItemEntity = $this->OrderItems->newEntity([ 'количество' => $orderItem['qty'], 'order_item_options' => [], ]); $productEntity = $this->OrderItems->Products->findOrCreate( ['product_id' => $orderItem['product_id'] ?? 2], функция ($entity) use ($orderItem) { $entity->product_code = $orderItem['product_code'] ?? нулевой; $entity->product_name = $orderItem['product_name']; $entity->product_color = $orderItem['product_color']['name'] ?? нулевой; } ); $orderItemEntity->продукт = $productEntity; $orderItemOptions = []; if (!empty($orderItem['fields'])) { $field = $orderItem['fields'][0]; if ($field['field_id'] === 2 && !empty($field['options'])) { foreach ($field['options'] as $option) { $orderItemOption = $this->OrderItems->OrderItemOptions->newEntity([ 'option_type' => $field['field_name'], 'option_value' => $option['code'], 'количество' => $option['qty'], 'sku' => $option['sku'] ]); $orderItemOptions[] = $orderItemOption; } } } если (!empty($orderItemOptions)) { $orderItemEntity->order_item_options = $orderItemOptions; } $orderEntity->order_items[] = $orderItemEntity; } $newOrders[] = $orderEntity; } } } если (!empty($newOrders)) { #Log::write('ошибка', 'Сохранение' . print_r($newOrders, true)); $savedOrders = $this->saveMany($newOrders, [ 'associated' => ['OrderItems.Products', 'OrderItems.OrderItemOptions'] ]); если ($ savedOrders) { вернуть истину; } еще { foreach ($newOrders как $order) { Log::error('Ошибка заказа:' . json_encode($order->getErrors())); foreach ($order->order_items как $item) { Log::error('Ошибка OrderItem:' . json_encode($item->getErrors())); } } } } вернуть ложь; } Таблица заказов:

публичная функция инициализации (массив $config): void { родитель:: инициализация ($ config); Syllable::setCacheDir(ROOT . DS . 'tmp' . DS . 'кэш'); $this->setTable('заказы'); $this->setDisplayField('имя'); $this->setPrimaryKey('id'); $this->addBehavior('Метка времени'); $this->belongsTo('Пользователи', [ 'foreignKey' => 'user_id', 'joinType' => 'ВНУТРЕННИЙ', ]); $this->belongsTo('ShippingServices', [ 'foreignKey' => 'shipping_service_id', 'joinType' => 'ВНУТРЕННИЙ', ]); $this->hasMany('OrderItems', [ 'foreignKey' => 'order_id', 'зависимый' => правда, ]); } Таблица Ордеритемс:

публичная функция инициализации (массив $config): void { родитель:: инициализация ($ config); $this->setTable('order_items'); $this->setDisplayField(['order_id', 'product_id']); $this->setPrimaryKey(['order_id', 'product_id']); $this->addBehavior('Метка времени'); $this->belongsTo('Заказы', [ 'foreignKey' => 'order_id', 'joinType' => 'ВНУТРЕННИЙ', ]); $this->belongsTo('Продукты', [ 'foreignKey' => 'product_id', 'joinType' => 'ВНУТРЕННИЙ', ]); $this->hasMany('OrderItemOptions', [ 'foreignKey' => 'order_item_id', 'зависимый' => правда, ]); } Таблица OrderItemOptions:

публичная функция инициализации (массив $config): void { родитель:: инициализация ($ config); $this->setTable('order_item_options'); $this->setDisplayField('option_type'); $this->setPrimaryKey(['order_item_id', 'order_id', 'product_id']); $this->addBehavior('Метка времени'); $this->belongsTo('OrderItems', [ 'foreignKey' => 'order_item_id', 'joinType' => 'ВНУТРЕННИЙ', ]); } Проведение трассировки стека с помощью Log::write

if (!empty($orderItemOptions)) { $orderItemEntity->order_item_options = $orderItemOptions; Log::write('ошибка', 'Сохранение ' . print_r($orderItemEntity, правда)); } 2024-01-05 06:31:47 ошибка: сохранение объекта App\Model\Entity\OrderItem ( [количество] => 150 [order_item_options] => Массив ( [0] => Объект App\Model\Entity\OrderItemOption ( [option_type] => Размер [option_value] => С [количество] => 50 [артикул] => STSU822C0081S [[новый]] => 1 [[доступный]] => Массив ( [order_item_id] => 1 [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 [создано] => 1 [изменено] => 1 [order_item] => 1 ) [[грязный]] => Массив ( [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 ) [[оригинал]] => Массив ( ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => OrderItemOptions ) [1] => Объект App\Model\Entity\OrderItemOption ( [option_type] => Размер [option_value] => М [количество] => 50 [артикул] => STSU822C0081M [[новый]] => 1 [[доступный]] => Массив ( [order_item_id] => 1 [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 [создано] => 1 [изменено] => 1 [order_item] => 1 ) [[грязный]] => Массив ( [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 ) [[оригинал]] => Массив ( ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => OrderItemOptions ) [2] => Объект App\Model\Entity\OrderItemOption ( [option_type] => Размер [option_value] => XL [количество] => 50 [артикул] => STSU822C0081X [[новый]] => 1 [[доступный]] => Массив ( [order_item_id] => 1 [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 [создано] => 1 [изменено] => 1 [order_item] => 1 ) [[грязный]] => Массив ( [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 ) [[оригинал]] => Массив ( ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => OrderItemOptions ) ) [продукт] => Приложение\Модель\Сущность\Объект продукта ( [идентификатор] => 27 [product_id] => 246924061 [код_продукта] => STSU822-B [product_name] => Толстовка унисекс STSU822 Cruiser Iconic [product_color] => Британский хаки [создано] => Объект Cake\I18n\FrozenTime ( [дата] => 05.01.2024 05:17:16.000000 [тип часового пояса] => 3 [часовой пояс] => Европа/Берлин ) [изменено] => Объект Cake\I18n\FrozenTime ( [дата] => 05.01.2024 05:17:16.000000 [тип часового пояса] => 3 [часовой пояс] => Европа/Берлин ) [[новое]] => [[доступный]] => Массив ( [product_id] => 1 [код_продукта] => 1 [имя_продукта] => 1 [product_color] => 1 [создано] => 1 [изменено] => 1 [order_items] => 1 ) [[грязный]] => Массив ( ) [[оригинал]] => Массив ( ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => Товары ) [[новый]] => 1 [[доступный]] => Массив ( [order_id] => 1 [product_id] => 1 [количество] => 1 [создано] => 1 [изменено] => 1 [порядок] => 1 [продукт] => 1 [order_item_options] => 1 ) [[грязный]] => Массив ( [количество] => 1 [order_item_options] => 1 [продукт] => 1 ) [[оригинал]] => Массив ( [order_item_options] => Массив ( ) ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => OrderItems ) 2024-01-05 06:31:47 ошибка: сохранение объекта App\Model\Entity\OrderItem ( [количество] => 150 [order_item_options] => Массив ( [0] => Объект App\Model\Entity\OrderItemOption ( [option_type] => Размер [option_value] => 100er [количество] => 150 [sku] => СБМУ-С13 [[новый]] => 1 [[доступный]] => Массив ( [order_item_id] => 1 [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 [создано] => 1 [изменено] => 1 [order_item] => 1 ) [[грязный]] => Массив ( [тип_опции] => 1 [option_value] => 1 [количество] => 1 [артикул] => 1 ) [[оригинал]] => Массив ( ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => OrderItemOptions ) ) [продукт] => Приложение\Модель\Сущность\Объект продукта ( [идентификатор] => 29 [product_id] => 247765931 [код_продукта] => СБМУ-С [product_name] => Зибдрук / Мит Унтердрук [product_color] => 2 – фарбиг [создано] => Объект Cake\I18n\FrozenTime ( [дата] => 05.01.2024 05:17:16.000000 [тип часового пояса] => 3 [часовой пояс] => Европа/Берлин ) [изменено] => Объект Cake\I18n\FrozenTime ( [дата] => 05.01.2024 05:17:16.000000 [тип часового пояса] => 3 [часовой пояс] => Европа/Берлин ) [[новое]] => [[доступный]] => Массив ( [идентификатор_продукта] => 1 [код_продукта] => 1 [имя_продукта] => 1 [product_color] => 1 [создано] => 1 [изменено] => 1 [order_items] => 1 ) [[грязный]] => Массив ( ) [[оригинал]] => Массив ( ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => Товары ) [[новый]] => 1 [[доступный]] => Массив ( [order_id] => 1 [product_id] => 1 [количество] => 1 [создано] => 1 [изменено] => 1 [порядок] => 1 [продукт] => 1 [order_item_options] => 1 ) [[грязный]] => Массив ( [количество] => 1 [order_item_options] => 1 [продукт] => 1 ) [[оригинал]] => Массив ( [order_item_options] => Массив ( ) ) [[виртуальный]] => Массив ( ) [[hasErrors]] => [[ошибки]] => Массив ( ) [[invalid]] => Массив ( ) [[репозиторий]] => Товары заказа ) 2024-01-05 06:31:47 ошибка: [ValueError] array_combine(): аргумент № 1 ($keys) и аргумент №2 ($values) должны иметь одинаковое количество элементов в /vendor/cakephp/cakephp/src /ORM/Association/HasMany.php в строке 170 Трассировки стека: - /vendor/cakephp/cakephp/src/ORM/Association/HasMany.php:170 - /vendor/cakephp/cakephp/src/ORM/AssociationCollection.php:315 - /vendor/cakephp/cakephp/src/ORM/AssociationCollection.php:285 - /vendor/cakephp/cakephp/src/ORM/AssociationCollection.php:245 - /vendor/cakephp/cakephp/src/ORM/Table.php:2074 - /vendor/cakephp/cakephp/src/ORM/Table.php:2047 - /vendor/cakephp/cakephp/src/ORM/Table.php:1940 - /vendor/cakephp/cakephp/src/ORM/Table.php:1582 - /vendor/cakephp/cakephp/src/Database/Connection.php:896 - /vendor/cakephp/cakephp/src/ORM/Table.php:1583 - /vendor/cakephp/cakephp/src/ORM/Table.php:1941 - /vendor/cakephp/cakephp/src/ORM/Association/HasMany.php:228 - /vendor/cakephp/cakephp/src/ORM/Association/HasMany.php:185 - /vendor/cakephp/cakephp/src/ORM/AssociationCollection.php:315 - /vendor/cakephp/cakephp/src/ORM/AssociationCollection.php:285 - /vendor/cakephp/cakephp/src/ORM/AssociationCollection.php:245 - /vendor/cakephp/cakephp/src/ORM/Table.php:2074 - /vendor/cakephp/cakephp/src/ORM/Table.php:2047 - /vendor/cakephp/cakephp/src/ORM/Table.php:1940 - /vendor/cakephp/cakephp/src/ORM/Table.php:1582 - /vendor/cakephp/cakephp/src/Database/Connection.php:896 - /vendor/cakephp/cakephp/src/ORM/Table.php:1583 - /vendor/cakephp/cakephp/src/ORM/Table.php:1941 - /vendor/cakephp/cakephp/src/ORM/Table.php:2320 - /vendor/cakephp/cakephp/src/Database/Connection.php:896 - /vendor/cakephp/cakephp/src/ORM/Table.php:2326 - /vendor/cakephp/cakephp/src/ORM/Table.php:2254 - /src/Model/Table/OrdersTable.php:370 - /src/Controller/OrdersController.php:258 - /vendor/cakephp/cakephp/src/Controller/Controller.php:560 - /vendor/cakephp/cakephp/src/Controller/ControllerFactory.php:140 - /vendor/cakephp/cakephp/src/Controller/ControllerFactory.php:115 - /vendor/cakephp/cakephp/src/Http/BaseApplication.php:325 - /vendor/cakephp/cakephp/src/Http/Runner.php:86 - /vendor/cakephp/authorization/src/Middleware/RequestAuthorizationMiddleware.php:110 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/authorization/src/Middleware/AuthorizationMiddleware.php:129 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/authentication/src/Middleware/AuthenticationMiddleware.php:124 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/cakephp/src/Http/Middleware/CsrfProtectionMiddleware.php:176 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/cakephp/src/Http/Middleware/BodyParserMiddleware.php:157 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/cakephp/src/Routing/Middleware/RoutingMiddleware.php:189 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/cakephp/src/Routing/Middleware/AssetMiddleware.php:68 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php:149 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php:60 - /vendor/cakephp/cakephp/src/Http/Runner.php:82 - /vendor/cakephp/cakephp/src/Http/Runner.php:67 - /vendor/cakephp/cakephp/src/Http/Server.php:99 - /webroot/index.php:40 - [основной]: URL-адрес запроса: /api/get/orders URL-адрес реферера: https://local.project.com/. IP клиента: 127.0.0.1 /src/Model/Table/OrdersTable.php:370

'associated' => ['OrderItems.Products', 'OrderItems.OrderItemOptions'] Дополнительный контекст: Важным наблюдением является то, что если я закомментирую строку, в которой order_item_options присваиваются $orderItemEntity, например:

// $orderItemEntity->order_item_options = $orderItemOptions; Заказ и OrderItems успешно сохраняются без каких-либо ошибок. Это наводит меня на мысль, что проблема заключается именно в том, как OrderItemOptions обрабатываются или связаны с OrderItem.

Любая информация о том, почему назначение order_item_options вызывает ошибку array_combine(), будет чрезвычайно полезна.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»