Shopware 6 - 在实体定义中具有多种类型列的复合主键
Shopware 6 - Composite primary key with columns of multiple types, in entity definition
这里是问题描述:
我为它创建了一个自定义实体和一个定义。
defineFields函数体是这样的:
protected function defineFields(): FieldCollection {
return new FieldCollection([
(new FkField('product_family_id', 'productFamilyId', ProductFamilyDefinition::class, 'id'))->addFlags(new ApiAware(), new Required(), new PrimaryKey()),
(new StringField('area_id', 'areaId'))->addFlags(new ApiAware(), new Required(), new PrimaryKey()),
(new StringField('block_number', 'blockNumber'))->addFlags(new ApiAware(), new Required(), new PrimaryKey()),
(new StringField('text', 'text')),
new CreatedAtField(),
new UpdatedAtField(),
(new ManyToOneAssociationField('productFamily', 'product_family_id', ProductFamilyDefinition::class, 'id')),
]);
}
因此,如您所见,我们需要有一个 product_family_id
、area_id
和 block_number
的复合主键。问题是,字段 area_id
和 block_number
需要是字符串类型。但是因为 PrimaryKey()
标志被添加到这些字段,Shopware 不想执行插入操作,因为 Shopware 现在希望这两个字段具有 UUID 长度(16 个字符)。如果我们删除 PrimaryKey()
标志,那么 area_id
和 block_number
字段可以有任何大小,因为它们应该。
可在此处找到此问题的请求/响应操作示例:
示例请求:
URL: http://localhost/api/_action/sync
BODY: [{"entity":"product_family_additional_info","action":"upsert","payload":[{"productFamilyId":"cb5e21bda1d8488ab5dda9d3fb4e4fe4","areaId":"22","blockNumber":"33","text":"text121"}]}]
响应示例:
{
"success": false,
"data": [
{
"result": [
{
"entities": [],
"errors": [
{
"status": "400",
"code": "FRAMEWORK__UUID_INVALID_LENGTH",
"title": "Bad Request",
"detail": "UUID has a invalid length. 16 bytes expected, 2 given. Hexadecimal reprensentation: 3232",
"meta": {
"parameters": {
"length": 2,
"hex": "3232"
}
}
}
]
}
],
"extensions": []
}
],
"deleted": [],
"notFound": [],
"extensions": []
}
那么,有没有办法让复合主键包含多种类型的列呢?当我们添加 PrimaryKey() 标志时,列不会被强制为 UUID 长度。
Shopware 期望 PrimaryKey
字段是 Uuid,但在您的情况下,您可以将自己的 IdField 添加到您的定义中,并且在创建 table 的数据库迁移中,您可以为您当前要用作复合主键的 3 个字段。
这里是问题描述:
我为它创建了一个自定义实体和一个定义。 defineFields函数体是这样的:
protected function defineFields(): FieldCollection {
return new FieldCollection([
(new FkField('product_family_id', 'productFamilyId', ProductFamilyDefinition::class, 'id'))->addFlags(new ApiAware(), new Required(), new PrimaryKey()),
(new StringField('area_id', 'areaId'))->addFlags(new ApiAware(), new Required(), new PrimaryKey()),
(new StringField('block_number', 'blockNumber'))->addFlags(new ApiAware(), new Required(), new PrimaryKey()),
(new StringField('text', 'text')),
new CreatedAtField(),
new UpdatedAtField(),
(new ManyToOneAssociationField('productFamily', 'product_family_id', ProductFamilyDefinition::class, 'id')),
]);
}
因此,如您所见,我们需要有一个 product_family_id
、area_id
和 block_number
的复合主键。问题是,字段 area_id
和 block_number
需要是字符串类型。但是因为 PrimaryKey()
标志被添加到这些字段,Shopware 不想执行插入操作,因为 Shopware 现在希望这两个字段具有 UUID 长度(16 个字符)。如果我们删除 PrimaryKey()
标志,那么 area_id
和 block_number
字段可以有任何大小,因为它们应该。
可在此处找到此问题的请求/响应操作示例:
示例请求:
URL: http://localhost/api/_action/sync
BODY: [{"entity":"product_family_additional_info","action":"upsert","payload":[{"productFamilyId":"cb5e21bda1d8488ab5dda9d3fb4e4fe4","areaId":"22","blockNumber":"33","text":"text121"}]}]
响应示例:
{
"success": false,
"data": [
{
"result": [
{
"entities": [],
"errors": [
{
"status": "400",
"code": "FRAMEWORK__UUID_INVALID_LENGTH",
"title": "Bad Request",
"detail": "UUID has a invalid length. 16 bytes expected, 2 given. Hexadecimal reprensentation: 3232",
"meta": {
"parameters": {
"length": 2,
"hex": "3232"
}
}
}
]
}
],
"extensions": []
}
],
"deleted": [],
"notFound": [],
"extensions": []
}
那么,有没有办法让复合主键包含多种类型的列呢?当我们添加 PrimaryKey() 标志时,列不会被强制为 UUID 长度。
Shopware 期望 PrimaryKey
字段是 Uuid,但在您的情况下,您可以将自己的 IdField 添加到您的定义中,并且在创建 table 的数据库迁移中,您可以为您当前要用作复合主键的 3 个字段。