2017-02-03 5 views
2

제 3 자 서비스 호출에서 가져온 제품 데이터가 있는데, 그 다음에 개체를 만들어 내 MySQL DB에 저장합니다. 다음과 같이 내 모델은 다음과 같습니다cakephp 3.x 중첩 된 (깊은) 연관 저장

'제품'hasMany의 >> 'product_skus'hasMany의 >> 'product_sku_attributes'내 ProductsTable.php 초기화 ​​() 메소드에서

table relationships

내가 가진 :

$this->hasMany('ProductSkus', [ 
    'foreignKey' => 'product_no', 
    'dependent' => true, 
]); 
내 ProductSkusTable.php의 초기화() 메소드에서

내가 가진 :

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

내 컨트롤러 : I 체크 두 배, 내 모든 필드가 내 테이블 엔티티 클래스와 같이 접근 설정

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

여기 내 엔티티 디버그에서 관련 조각입니다. 또한,이 시점에서 나는 단순성을 위해 하나의 제품 레코드 만 저장하려하고 있으므로, $ products-> newEntity().

내 데이터가 '제품'및 'product_skus'테이블에 저장되지만 'product_sku_products'에는 저장되지 않습니다. 누구든지 문제가 무엇인지 볼 수 있습니까? 동일한 foreignKey를 사용하지 않기 때문입니까?

내가 명확성을 위해 무엇을 제공 할 수 있는지 알려 주시기 바랍니다.

답변

1

데이터가 마샬링되지 않고 배열의 배열이며 엔티티 배열이 아니므로 저장되지 않습니다.

엔티티를 저장할 때와 마찬가지로 기본적으로 관련 데이터를 사용하여 생성/패치하는 것은 첫 번째 레벨 연결에 대해서만 작동합니다. 또한

+0

아는 물론-I는 동안 협회를 지정해야합니다

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

참조 : 깊은 중첩 협회는 associated 옵션을 통해이를 지정하는 즉 필요 ** 저장하기 전에 ** 엔티티 생성. 이제는 분명해 보입니다. 고마워요, 고마워요! 시간을내어 주셔서 감사합니다. – stoff

+0

안녕하세요 @ndm 및 @stoff, 문제의 직유 유형이 있습니다. 나는이 ans를 따라 갔고 또한 문서를 읽었다. 그것은 나를 위해 작동하지 않습니다. 제 경우에는 company => hasMany AppVersions 및 AppVersions hasMany => Assistance and Assistances => 많은 AssistanceApplicationTypes.'을 포함하고 있습니다. 이제 compnay, appVersion, Assistance는 저장할 수 있지만 Assistances.AssistanceApplicationTypes는 저장할 수 없습니다. 'patchEntity()'후에도'Assistances.AssistanceApplicationTypes'는 여전히 객체가 아닌 array()로 남아 있습니다. 다른 것들은 대상이되고 있습니다. 도와 줄 수있어? – user2480902

+0

@ user2480902 아마도'associated' 옵션을 적절히 설정하지 않았거나 테이블이나 연결조차 제대로 설정되지 않았을 것입니다. – ndm