You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编辑订单后OneToMany扩展数据被删除的问题排查

订单编辑后扩展数据被删除的问题分析与解决

问题根源

订单编辑操作会触发Shopware的版本机制,生成新的订单版本ID。你的扩展实体通过ReferenceVersionField绑定了旧的订单版本ID,结合Inherited标记的关联配置,系统在处理订单版本更新时,会判定旧版本关联的扩展数据不属于当前订单版本,进而将其删除。

具体修复步骤

1. 调整扩展实体的ReferenceVersionField配置

移除ReferenceVersionField上的Required标记——订单版本更新时该字段无法自动同步,强制必填会导致旧数据因版本不匹配被清理:

(new ReferenceVersionField(OrderDefinition::class, 'order_version_id'))
// 移除->addFlags(new Required())

2. 优化OneToMany关联的版本处理

在OneToManyAssociationField上添加VersionAware标记(Shopware 6.4+支持),确保关联数据能正确跟随订单版本更新:

$collection->add(
    (new OneToManyAssociationField(
        'example',
        ExampleDefinition::class,
        'order_id'
    ))->addFlags(
        new CascadeDelete(),
        new Inherited(),
        new VersionAware() // 添加该标记
    )
);

3. 避免手动设置order_version_id

添加扩展数据时无需手动指定order_version_id,Shopware会自动根据当前订单版本填充该字段:

$values = array_map(static function ($value) use($event) {
    return [
        'id' => Uuid::randomHex(),
        'value' => $value['value'],
        'orderId' => getOrder()->getId()
        // 移除 'order_version_id' => getOrder()->getVersionId()
    ];
}, $new_values);

4. 完善迁移与索引配置

确保迁移逻辑正确,同步继承关系并添加版本索引:

$this->updateInheritance($connection, 'order', 'example');
$this->registerIndexer($connection, 'Swag.InheritanceIndexer');
// 添加版本索引优化查询与版本校验
$this->addSql('CREATE INDEX IF NOT EXISTS idx_example_order_version_id ON `example` (`order_version_id`)');

补充说明

Shopware的订单版本机制会对关联的继承实体做版本校验,只有版本ID匹配的数据才会被视为当前订单的有效扩展。通过上述调整,让扩展数据不再强绑定单一订单版本,同时通过VersionAware标记让系统自动处理版本关联,即可避免编辑订单时扩展数据被删除的问题。

内容的提问来源于stack exchange,提问作者Tobias Schäfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:10:27