2017-02-03 3 views
2

У меня есть данные о продуктах, поступающие от стороннего вызова службы, которые я затем создаю и сохраняю в моей базе данных MySQL. Мои модели заключаются в следующем:cakephp 3.x Сохранение вложенных (глубоких) ассоциаций

hasMany 'продукты' >> hasMany 'product_skus' >> '' product_sku_attributes

table relationships

В моем методе ProductsTable.php инициализации() У меня есть:

$this->hasMany('ProductSkus', [ 
    'foreignKey' => 'product_no', 
    'dependent' => true, 
]); 

В моем методе ProductSkusTable.php Initialize() у меня есть:

$this->hasMany('ProductSkuAttributes', [ 
    'foreignKey' => 'product_sku_id', 
    'bindingKey' => 'id', 
    'propertyName' => 'product_sku_attributes', 
    'dependent' => true, 
]); 

Мой контроллер:

$products = TableRegistry::get('Products'); 
$entity = $products->newEntity($product_data[0]); 
$products->save($entity, [ 
    'associated' => [ 
     'ProductSkus', 
     'ProductSkus.ProductSkuAttributes', 
    ] 
]); 

Вот это отношение отрывок из моей сущности отладки:

'product_skus' => [ 
    (int) 0 => object(App\Model\Entity\ProductSkus) { 

     'sku' => 'BDS1401H', 
     'sku_price' => (float) 366.76, 
     'sku_weight' => (float) 38.1, 
     'sku_img_main' => '', 
     'sku_img_large' => '', 
     'sku_img_default' => false, 
     'is_default' => true, 
     'product_sku_attributes' => [ 
      (int) 0 => [ 
       'product_no' => (int) 23200, 
       'sku' => 'BDS1401H', 
       'attribute_name' => 'Front Sway Bar Links', 
       'option_name' => 'Stock' 
      ], 
      (int) 1 => [ 
       'product_no' => (int) 23200, 
       'sku' => 'BDS1401H', 
       'attribute_name' => 'Shock Options', 
       'option_name' => 'NX2 Series' 
      ], 
      (int) 2 => [ 
       'product_no' => (int) 23200, 
       'sku' => 'BDS1401H', 
       'attribute_name' => 'Steering Stabilizer Options', 
       'option_name' => 'Stock' 
      ] 
     ], 
     '[new]' => true, 
     '[accessible]' => [ 
      '*' => true, 
      'id' => true 
     ], 
     '[dirty]' => [ 
      'sku' => true, 
      'sku_price' => true, 
      'sku_weight' => true, 
      'sku_img_main' => true, 
      'sku_img_large' => true, 
      'sku_img_default' => true, 
      'is_default' => true, 
      'product_sku_attributes' => true 
     ], 
     '[original]' => [], 
     '[virtual]' => [], 
     '[errors]' => [], 
     '[invalid]' => [], 
     '[repository]' => 'ProductSkus' 

    }, 
    (int) 1 => object(App\Model\Entity\ProductSkus) { ... 

я в два раза проверил, и все мои поля установлены как доступны в моих классах таблиц сущностей. Кроме того, на данный момент я просто пытаюсь сохранить одну запись продукта для простоты, поэтому $ products-> newEntity().

Мои данные без проблем сохраняются в таблицах «товары» и «product_skus», но не «product_sku_products». Кто-нибудь может понять, в чем проблема? Это потому, что я не использую тот же foreignKey?

Пожалуйста, дайте мне знать, что еще я могу предоставить для ясности.

ответ

1

Данные product_sku_attributes не сортируются, это массив массивов, а не массив сущностей, поэтому он не сохраняется.

Как и при сохранении сущностей, создание/исправление их связанными данными по умолчанию работает только для ассоциаций первого уровня. Deeper вложенные ассоциации требуют, чтобы задать их с помощью опции associated, то есть:

$entity = $products->newEntity($product_data[0], [ 
    'associated' => 'ProductSkus.ProductSkuAttributes' 
]); 

Смотрите также

+0

Ааа, конечно, мне нужно указать ассоциации в течение создание сущностей ** до ** сохранения. Кажется, сейчас так очевидно. Спасибо Спасибо! Я ценю, что вы нашли время :) – stoff

+0

Здравствуйте, @ndm и @stoff, у меня есть аналогичный тип проблемы. Я следил за этим и читал документацию. Это не работает для меня. В моем случае 'company => hasMany AppVersions и AppVersions hasMany => Ассистенты и ассистенты => имеет много типов AssistanceApplicationTypes.' до сих пор я могу сохранить compnay, appVersion, Assistance, но не (Assistances.AssistanceApplicationTypes). после 'patchEntity()' 'Assistances.AssistanceApplicationTypes' остается массивом(), не являющимся объектом. Другие являются объектами. Можете ли вы, парень, помочь мне? – user2480902

+0

@ user2480902 Возможно, вы неправильно настроили опцию 'related', или, может быть, даже таблицы или ассоциации не настроены должным образом. – ndm

Смежные вопросы