命令 dal:create:schema 不创建外键

The command dal:create:schema does not create foreign keys

给定以下实体定义示例,定义了一个外键。作为一名开发人员和数据库工程师,我希望命令 dal:create:schema 也能创建预期的外键。但事实并非如此。

 return new FieldCollection([
    (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),

    (new LongTextField('comment', 'name'))->addFlags(new Required()),

    (new FkField('order_id', 'orderId', OrderDefinition::class))->addFlags(new Required()),
    new OneToOneAssociationField('order', 'order_id', 'id', OrderDefinition::class, false),

            new CreatedAtField(),
            new UpdatedAtField()
        ]);

结果是这样的:

CREATE TABLE `order_refund` (
    `id` BINARY(16) NOT NULL,
    `comment` LONGTEXT NOT NULL,
    `order_id` BINARY(16) NOT NULL,
    `created_at` DATETIME(3) NOT NULL,
    `updated_at` DATETIME(3) NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

不过,好像ManyToOneAssociations会加外键。实体定义中是否缺少某些内容?

您提到的命令使用的是 SchemaGenerator,它具有生成外键的方法:

\Shopware\Core\Framework\DataAbstractionLayer\SchemaGenerator::generateForeignKeys

从这个方法来看,它似乎只适用于 ManyToOneAssociationField

类型的字段
private function generateForeignKeys(EntityDefinition $definition): string
{
    $fields = $definition->getFields()->filter(
        function (Field $field) {
            if (!$field instanceof ManyToOneAssociationField) {
                return false;
            }

            return true;
        }
    );

我也认为这个函数的缺点是它不会为OneToOneAssociationField类型的字段生成外键。也许您可以尝试调整此过滤并查看它是否有效,然后为了您自己和其他开发人员的利益在 GitHub 上发出拉取请求?