cakephp 3.x保存嵌套(深层)关联

时间:2017-02-03 09:25:21

标签: cakephp orm associations cakephp-3.x

我有来自第三方服务电话的产品数据,然后我创建一个对象并保存到我的MySQL数据库。我的模型如下:

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

我加倍检查,并且我的所有字段都在我的表实体类中设置为可访问。此外,在这一点上,我只是为了简单起见只保存一个产品记录,因此$ products-> newEntity()。

我的数据保存到'products'和'product_skus'表没有问题,但没有'product_sku_products'。任何人都可以看到问题是什么?是因为我没有使用相同的foreignKey吗?

请让我知道我还能提供哪些清晰的内容。

1 个答案:

答案 0 :(得分:4)

product_sku_attributes数据没有被编组,它仍然是一个数组数组,而不是一个实体数组,因此它没有被保存。

就像保存实体一样,默认情况下创建/修补它们与关联数据仅适用于第一级关联。更深层次的嵌套关联需要通过associated选项指定它们,即:

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

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

另见