命令 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 上发出拉取请求?
给定以下实体定义示例,定义了一个外键。作为一名开发人员和数据库工程师,我希望命令 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 上发出拉取请求?