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'
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.
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
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
@ user2480902 Wahrscheinlich haben Sie die 'associated' Option nicht richtig konfiguriert, oder vielleicht sind sogar die Tabellen oder Assoziationen nicht richtig eingerichtet. – ndm