【问题标题】:Extending Shopware entity with foreign keys fails when merging version合并版本时使用外键扩展 Shopware 实体失败
【发布时间】:2022-07-30 01:46:45
【问题描述】:

我正在开发我的第一个 Shopware 6 管理插件,它需要扩展一个现有的 Shopware 插件 - 自定义产品。

我想在现有实体之间添加关系 - TemplateExclusion 和 TemplateOptionDefinition。当我从 UI 中选择我的选项时,TemplateExclusion 实体它会保存在数据库中,没有任何问题。

当我保存模板实体(TemplateExclusion 的父级)时,我的“excluded_option_id”会被 TemplateOptionDefinition 实体中的第一个可能选项覆盖。

我注意到这发生在“mergeVersion”上。此外,当我尝试在启用调试模式和探查器的情况下保存模板实体时,在保存过程中出现错误,“excludedOptionId”在合并时为空白,这是不正确的。

Error in profiler

按照我首先制作的文档进行迁移:

class Migration1643023742TemplateExclusionRelation extends MigrationStep
{
    public function getCreationTimestamp(): int
    {
        return 1643023742;
    }

    public function update(Connection $connection): void
    {
        $connection->executeStatement('ALTER TABLE `swag_customized_products_template_exclusion` ADD COLUMN `excluded_option_id` BINARY(16) AFTER `template_version_id`;');
        $connection->executeStatement('ALTER TABLE `swag_customized_products_template_exclusion` ADD COLUMN `excluded_option_version_id` BINARY(16) AFTER `excluded_option_id`;');
        $connection->executeStatement('ALTER TABLE `swag_customized_products_template_exclusion` ADD CONSTRAINT `fk.swag_cupr_template_exclusion.excluded_option_id` FOREIGN KEY (`excluded_option_id`, `excluded_option_version_id`)
        REFERENCES `swag_customized_products_template_option` (`id`, `version_id`) ON DELETE CASCADE ON UPDATE CASCADE;');
    }

然后我做了一个实体扩展,在哪里定义新字段。

class TemplateExclusionExtension extends EntityExtension
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            (new FkField('excluded_option_id', 'excludedOptionId', TemplateOptionDefinition::class))
                ->addFlags(new Required(), new ApiAware())
        );

        $collection->add(
            (new ManyToOneAssociationField('excludedOption', 'excluded_option_id', TemplateOptionDefinition::class))
                ->addFlags(new ApiAware())
        );

        $collection->add(
            (new ReferenceVersionField(TemplateOptionDefinition::class, 'excluded_option_version_id'))
                ->addFlags(new Required(), new ApiAware()),
        );
    }

    public function getDefinitionClass(): string
    {
        return TemplateExclusionDefinition::class;
    }
}

已解决:

我的定义是错误的:

public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            (new FkField('excluded_option_id', 'excludedOptionId', TemplateOptionDefinition::class))
                ->addFlags(new Required(), new ApiAware())
        );

        $collection->add(
            (new OneToOneAssociationField(
                EasyExtendCustomizedProducts::TEMPLATE_EXCLUSION_EXCLUDED_OPTION_EXTENSION,
                'excluded_option_id',
                'id',
                TemplateOptionDefinition::class,
                false
            ))->addFlags(new CascadeDelete(), new ApiAware())
        );
    }

    public function getDefinitionClass(): string
    {
        return TemplateExclusionDefinition::class;
    }

【问题讨论】:

  • 酷 - 您可以将此作为答案发布。定义中到底有什么错误?

标签: entity shopware extending shopware6


【解决方案1】:

如果我没记错的话,问题是缺少 CascadeDelete 删除标志。

为了对实体进行版本化,首先获取包括其关联数据的实体,然后使用新的主键进行持久化,因此基本上它会被克隆。但是,在获取要克隆的数据时,并非所有关联都被考虑在内。您可以找到负责的代码here,其中受影响的关联通过CascadeDelete 标志的存在进行过滤。如果他们错过了标志,他们将被忽略以创建克隆版本。这种行为仍然需要更加突出地记录下来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2023-04-06
    • 2011-03-31
    • 2015-03-06
    • 2018-11-18
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多