编辑订单后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
相关产品推荐
相关产品推荐

