1

给定以下实体定义示例,定义了一个外键。作为开发人员和数据库工程师,我希望该命令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 似乎会添加外键。实体定义中是否缺少某些内容?

4

1 回答 1

0

您提到的命令是使用 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;
        }
    );

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

于 2022-02-06T08:16:57.043 回答