Shopware DAL版本创建与合并:关联包含及订单编辑实体配置问题
问题解答
核心问题答案
是的,必须把这个关联实体设置为版本感知,否则订单克隆流程不会自动复制该实体,后续版本合并时就会因为找不到对应版本的关联实体而触发外键(FK)错误。你的实体目前只是通过ReferenceVersionField关联了订单的版本,但自身没有开启版本感知,所以不在Shopware订单版本克隆的范围内。
支持订单编辑(版本创建与合并)的实体定义关键检查点
- 开启实体版本感知:实体类必须实现
VersionableInterface,同时在实体定义中添加VersionField,这是让实体被纳入版本克隆流程的核心标记。 - 配置正确的版本关联字段:保留
ReferenceVersionField(对应你的order_version_id),确保关联的是订单的具体版本记录,而非主订单ID,这是版本感知关联的基础。 - 关联关系适配版本机制:
ManyToOneAssociationField要与版本字段匹配,且关联的目标实体(如这里的OrderDefinition)本身已开启版本感知(订单默认是版本感知的,这部分你已经做对了)。 - 字段标记完整性:确保主键、外键、版本字段都添加了必要的Flag(比如
Required、ApiAware),避免克隆时遗漏关键字段导致数据不完整。 - 合并逻辑兼容性:如果实体有自定义业务逻辑,需确认
VersionMerger能正确处理该实体的合并逻辑,基础场景下开启版本感知后默认逻辑即可正常工作。
针对你提供的实体定义的修改建议
在你的实体定义中,需要添加版本字段,并确保实体类实现版本接口:
// 实体类实现VersionableInterface class YourEntityDefinition extends EntityDefinition implements VersionableInterface { // ... 其他代码 public function defineFields(): FieldCollection { return new FieldCollection([ (new IdField('id', 'id'))->addFlags(new ApiAware(), new PrimaryKey(), new Required()), // 添加版本字段 (new VersionField())->addFlags(new ApiAware(), new Required()), (new FkField('order_id', 'orderId', OrderDefinition::class))->addFlags(new ApiAware(), new Required()), (new ReferenceVersionField(OrderDefinition::class, 'order_version_id'))->addFlags(new ApiAware(), new Required()), // ... entity content (new CustomFields())->addFlags(new ApiAware()), (new ManyToOneAssociationField('order', 'order_id', OrderDefinition::class, 'id', false))->addFlags(new ApiAware()), ]); } }
内容的提问来源于stack exchange,提问作者Joshua Behrens
相关产品推荐
相关产品推荐

