简体   繁体   English

Shopware 6 自定义插件,在删除父项时删除扩展名不起作用

[英]Shopware 6 custom plugin, deleting extension on delete parent does not work

I have an extension created following the manual Adding complex data to existing entities .我按照手册Adding complex data to existing entities创建了一个扩展。
My product has with this extension another property like eg product_color .我的产品具有此扩展的另一个属性,例如product_color On delete the product the prop (entity table) product_color still remains in the database.删除产品时,prop(实体表) product_color仍保留在数据库中。

// Migration%123%ProductColor.php

...
    public function update(Connection $connection): void
    {
        $sql = <<<SQL
CREATE TABLE `product_color` (
  `id` binary(16) NOT NULL,
  `product_id` binary(16) DEFAULT NULL,
  `color` tinyint(1) NOT NULL DEFAULT '0',
  `created_at` datetime(3) NOT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SQL;
        $connection->executeStatement($sql);
    }
...

EDIT #1编辑#1
As recommend by @Alex, i've added flags, but the extension keep in the database :正如@Alex 所推荐的,我添加了标志,但扩展名保留在数据库中

// custom/plugins/MyPlugin/src/Extension/ProductColor/ProductColorExtension.php

class ProductColorExtension extends EntityExtension
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection
            ->add(
                (new OneToOneAssociationField(
                'productColor',
                'id',
                'product_id',
                ProductColorExtensionDefinition::class,
                true
            ))->addFlags(new CascadeDelete())
            );
    }

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

Questions:问题:

  • how to make the additional property deletable on delete its parent ( delete cascade )?如何使附加属性在删除其父项时可删除(删除级联)?
  • where are the corresponding manual how to achieve this?相应的手册在哪里?如何实现这一点?

There is a flag CascadeDelete which you can add to your association field:一个标志CascadeDelete ,您可以将其添加到您的关联字段中:

->addFlags(new CascadeDelete())

This should lead to an ON DELETE CASCADE entry in the SQL, if you create it with dal:create:schema .如果您使用dal:create:schema创建它,这应该导致 SQL 中的ON DELETE CASCADE条目。

In addition to setting the CascadeDelete flag in the entity definition, you need to add a foreign key constraint with your database migration and use CASCADE for the ON DELETE subclause.除了在实体定义中设置CascadeDelete标志外,您还需要在数据库迁移中添加外键约束,并为ON DELETE子句使用CASCADE

ALTER TABLE `product_color` 
ADD CONSTRAINT `fk.product_color.product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM