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_idarea_idblock_number 的复合主键。问题是,字段 area_idblock_number 需要是字符串类型。但是因为 PrimaryKey() 标志被添加到这些字段,Shopware 不想执行插入操作,因为 Shopware 现在希望这两个字段具有 UUID 长度(16 个字符)。如果我们删除 PrimaryKey() 标志,那么 area_idblock_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 个字段。