如何在控制器中向 Shopware 6 产品添加新的交叉销售?

How to add new crossSellings to Shopware 6 product in a Controller?

我有一个产品 ID 链接到其他产品 ID 的字典。对于每个产品,我想使用上述关系中的 id 创建新的交叉销售(产品列表)。 是否可以在控制器中更新产品交叉销售?
应该通过更新方法还是其他方式来完成?

$this->productRepository->update([$productData], Context::createDefaultContext());

Update 或 Upsert 似乎也没有对产品做任何事情。

 $crossSellingData = [
    'id' => $crossSellingIds[0],
    'name' => 'First Cross Selling',
    'position' => 1,
    'type' => 'productList',
    'active' => true,
    'assignedProducts' => [
        [
            'productId' => "5f5365e2adb446f6958faa4257c0af6d",
            'position' => 1
        ]
    ],
];
$productRepository->upsert([['id' => $productId, 'crossSelling' => $crossSellingData]], Context::createDefaultContext());

您可以使用 productCrossSellingRepository (Table: product_cross_selling) 代替。

$newCrossSelling = [
    'productId' => $mainProductId,
    'active' => true,
    'name' => 'First Cross Selling',
    'type' => 'productList',
    'position' => 1,
    'assignedProducts' => [
        [
            'productId' => $firstCrossSellingProductId,
            'position' => 1,
        ],
        [
            'productId' => $secondCrossSellingProductId,
            'position' => 2,
        ],
    ]
];

$this->productCrossSellingRepository->create([$newCrossSelling], Context::createDefaultContext());

还应该可以在产品存储库中添加交叉销售。 我在您的原始代码中看到两个问题:

  1. 关联名为 crossSellings,您使用 crossSelling,因为没有名为 crossSelling 的字段,存储库忽略该键,这样您的更新就没有效果
  2. 关联太多,这意味着存储库需要 crossSellings 个列表,而不是一个交叉销售。

因此,您对原始 upsert 调用的这些小改动应该可以解决您的问题:

$productRepository->upsert([['id' => $productId, 'crossSellings' => [$crossSellingData]]], Context::createDefaultContext());

注意 crossSelling-Association 名称中的尾随 s 和 crossSellingData

周围额外的 [] 数组