自定义实体无ReferenceVersionField,能否扩展ProductManufacturer的一对多关联或自定义版本字段名?
问题1:能否在版本化实体(如ProductManufacturer)扩展中使用OneToManyAssociationField,关联的自定义实体不包含ReferenceVersionField?
可以实现,但需要显式配置关联字段关闭自动版本关联。
Shopware的版本化实体(比如ProductManufacturer)默认会在关联查询时自动尝试关联对应版本字段,但如果你的自定义实体不需要维护版本关联,可以在定义OneToManyAssociationField时,将referenceVersionField参数设置为null,示例代码如下:
// 在ProductManufacturerDefinition的扩展类中 new OneToManyAssociationField( 'myCustomEntity', MyCustomEntityDefinition::class, 'product_manufacturer_id', // 自定义实体中关联ProductManufacturer的外键字段 null // 显式关闭版本字段关联 )
配置后,自定义实体仅需包含product_manufacturer_id字段即可正常关联,DAL生成查询时不会再尝试引用不存在的product_manufacturer_version_id字段。
问题2:若需要保留版本关联,能否自定义引用版本字段的命名(而非默认的product_manufacturer_version_id)?
完全可以。在定义OneToManyAssociationField时,将referenceVersionField参数设置为你自定义的版本字段名称即可,示例代码如下:
// 在ProductManufacturerDefinition的扩展类中 new OneToManyAssociationField( 'myCustomEntity', MyCustomEntityDefinition::class, 'manufacturer_id', // 自定义的关联外键字段 'custom_manufacturer_version_id' // 自定义的版本引用字段名 )
此时你的自定义实体需要同时包含manufacturer_id(关联ProductManufacturer的外键)和custom_manufacturer_version_id(自定义版本字段),DAL会使用你指定的字段名生成查询逻辑,替代默认命名。
关于你遇到的SQL错误说明
你触发的Unknown column 'product_manufacturer.myCustomEntity.product_manufacturer_version_id'错误,是因为ProductManufacturer属于Shopware自带的版本化实体,默认情况下DAL会假设关联的自定义实体需要维护版本引用,自动生成对默认版本字段的查询。通过上述两种配置方式,即可解决该错误。
内容的提问来源于stack exchange,提问作者Rune Laenen

