cakephp 3.x 保存嵌套(深)关联
cakephp 3.x Saving Nested (deep) Association
我有来自第 3 方服务调用的产品数据,然后我从中创建一个对象并将其保存到我的 MySQL 数据库中。我的模型如下:
'products' 有很多>> 'product_skus' 有很多>> 'product_sku_attributes'
table relationships
在我的 ProductsTable.php initialize() 方法中我有:
$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) { ...
我仔细检查了一下,我的所有字段都设置为可以在我的 table 实体 类 中访问。另外,在这一点上,为了简单起见,我只是想保存一个产品记录,因此 $products->newEntity().
我的数据可以毫无问题地保存到 'products' 和 'product_skus' table,但不会保存到 'product_sku_products'。任何人都可以看到问题是什么吗?是因为我没有使用相同的foreignKey吗?
为了清楚起见,请让我知道我还能提供什么。
product_sku_attributes
数据没有被编组,它仍然是一个数组数组,而不是一个实体数组,因此它没有被保存。
就像保存实体一样,默认情况下creating/patching它们与关联数据仅适用于一级关联。更深的嵌套关联需要通过 associated
选项指定它们,即:
$entity = $products->newEntity($product_data[0], [
'associated' => [
'ProductSkus.ProductSkuAttributes'
]
]);
$products->save($entity, [
'associated' => [
'ProductSkus.ProductSkuAttributes'
]
]);
另见
我有来自第 3 方服务调用的产品数据,然后我从中创建一个对象并将其保存到我的 MySQL 数据库中。我的模型如下:
'products' 有很多>> 'product_skus' 有很多>> 'product_sku_attributes'
table relationships
在我的 ProductsTable.php initialize() 方法中我有:
$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) { ...
我仔细检查了一下,我的所有字段都设置为可以在我的 table 实体 类 中访问。另外,在这一点上,为了简单起见,我只是想保存一个产品记录,因此 $products->newEntity().
我的数据可以毫无问题地保存到 'products' 和 'product_skus' table,但不会保存到 'product_sku_products'。任何人都可以看到问题是什么吗?是因为我没有使用相同的foreignKey吗?
为了清楚起见,请让我知道我还能提供什么。
product_sku_attributes
数据没有被编组,它仍然是一个数组数组,而不是一个实体数组,因此它没有被保存。
就像保存实体一样,默认情况下creating/patching它们与关联数据仅适用于一级关联。更深的嵌套关联需要通过 associated
选项指定它们,即:
$entity = $products->newEntity($product_data[0], [
'associated' => [
'ProductSkus.ProductSkuAttributes'
]
]);
$products->save($entity, [
'associated' => [
'ProductSkus.ProductSkuAttributes'
]
]);
另见