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

5

我从第三方服务调用中获取产品数据,然后创建一个对象并保存到我的MySQL数据库。我的模型如下:

'products' hasMany>> 'product_skus' hasMany>> 'product_sku_attributes'

表关系

在我的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”表中。有人看出问题所在吗?是因为我没有使用相同的外键吗?
请告诉我还需要提供什么信息以使文意更加清晰。
1个回答

5
product_sku_attributes 数据没有被编组,它仍然是一个数组的数组,而不是实体的数组,因此它没有被保存。
就像在保存实体时一样,在默认情况下使用关联数据来创建/修补它们仅适用于第一级关联。更深层次的嵌套关联需要通过 associated 选项指定。
$entity = $products->newEntity($product_data[0], [
    'associated' => [
        'ProductSkus.ProductSkuAttributes'
    ]
]);

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

另请参阅


啊哈,当然——我需要在实体创建时指定关联,在保存之前。现在看起来很明显了。谢谢你,谢谢!我感激你抽出时间 :) - stoff
你好@ndm和@stoff,我有类似的问题。我已经按照这个答案并阅读了文档。但是对我来说没有用。在我的情况下,company => hasMany AppVersionsAppVersions hasMany => Assistances以及Assistances => has many AssistanceApplicationTypes.到目前为止,我可以保存公司、appVersion和Assistance,但不能保存(Assistances.AssistanceApplicationTypes)。在patchEntity()之后,Assistances.AssistanceApplicationTypes仍然保持为array()而不是对象。其他的都是对象。你们能帮我吗? - ofaruk
@user2480902,您可能尚未正确配置“associated”选项,或者表格或关联设置不正确。 - ndm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接