2017-02-03 5 views
2

Ich habe Produktdaten von einem Drittanbieter-Service-Aufruf, dass ich dann ein Objekt erstellen und in meiner MySQL DB speichern. Meine Modelle sind wie folgt:CakePHP 3.x Speichern geschachtelte (tiefe) Assoziation

'Produkte' hasMany >> 'product_skus' hasMany >> 'product_sku_attributes'

table relationships

In meinem ProductsTable.php initialisieren() Methode, die ich habe:

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

In meiner ProductSkusTable.php Methode initialize() ich habe:

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

Mein Controller:

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

Hier ist der entsprechende Ausschnitt aus meiner Einheit debug:

'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) { ... 

Ich habe verdoppelten, und alle meine Felder sind so zugänglich in meiner Tabelle Entitätsklassen gesetzt. Außerdem versuche ich an dieser Stelle nur einen Produktdatensatz zu speichern, daher $ products-> newEntity().

Meine Daten werden ohne Probleme in 'products' und 'product_skus' Tabellen gespeichert, aber nicht in 'product_sku_products'. Kann jemand sehen, was das Problem ist? Liegt es daran, dass ich nicht den gleichen Fremdschlüssel verwende?

Bitte lassen Sie mich wissen, was ich noch für Klarheit bieten kann.

Antwort

1

Die product_sku_attributes Daten werden nicht gemarshallt, es ist immer noch ein Array von Arrays und kein Array von Entitäten, daher wird es nicht gespeichert.

Genau wie beim Speichern von Entitäten funktioniert das Erstellen/Patchen mit zugeordneten Daten standardmäßig nur für Zuordnungen der ersten Ebene. Tiefer verschachtelte Verbände verlangen, daß sie über die associated Option geben, das heißt:

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

Siehe auch

+0

Ahhh, natürlich-I die Verbände während der angeben müssen Erstellen der Entitäten ** vor dem Speichern. Scheint jetzt so offensichtlich. Danke Danke! Ich schätze, Sie nehmen sich die Zeit :) – stoff

+0

Hallo @ndm und @stoff, ich habe ähnliche Art von Problem. Ich bin diesem und habe auch die Dokumentation gelesen. Es funktioniert nicht für mich. In meinem Fall 'company => hasMany AppVersions und AppVersions hasMany => Assistances and Assistances => hat viele AssistanceApplicationTypes.' Bis jetzt kann ich die compnay, appVersion, Assistance aber nicht speichern (Assistances.AssistanceApplicationTypes). nach 'patchEntity()' bleiben die 'AssistancesAssistanceApplicationTypes' immer noch array(), das kein Objekt ist. Andere sind Objekt. Kannst du mir helfen? – user2480902

+0

@ user2480902 Wahrscheinlich haben Sie die 'associated' Option nicht richtig konfiguriert, oder vielleicht sind sogar die Tabellen oder Assoziationen nicht richtig eingerichtet. – ndm

Verwandte Themen