Hallo zusammen,
ich versuche seit Tagen erfolglos die Vererbung einer Association hinzubekommen. Normale Inheritance-Felder funktionieren einwandfrei und übernehmen den Wert vom parent. Nur die Association bleibt in der DB immer null.
Ich habe mir die Docs (Field Inheritance | Shopware Documentation) mehrfach durchgesehen, kann aber nicht erkennen, was ich falsch mache bzw. wo das Problem liegt:
Produkt-Extension-Definition
(Vererbung von „product_distributor_id“ funktioniert, von „distributor“ nicht):
class ProductExtensionDefinition extends EntityDefinition
{
public const ENTITY_NAME = 'product_extension';
...
public function isInheritanceAware(): bool
{
return true;
}
protected function defineFields(): FieldCollection
{
return new FieldCollection([
(new IdField('id', 'id'))->addFlags(new Required(), new PrimaryKey()),
(new FkField('product_id', 'productId', ProductDefinition::class))->addFlags(new Required()),
(new ReferenceVersionField(ProductDefinition::class, 'product_version_id'))->addFlags(new Required()),
(new ParentFkField(self::class))->addFlags(new ApiAware()),
(new ParentAssociationField(self::class, 'id'))->addFlags(new ApiAware()),
(new ChildrenAssociationField(self::class))->addFlags(new ApiAware()),
(new FkField('product_distributor_id', 'distributorId', ProductDistributorDefinition::class))->addFlags(new ApiAware(), new Inherited()),
new OneToOneAssociationField('product', 'product_id', 'id', ProductDefinition::class, false),
(new ManyToOneAssociationField('distributor', 'product_distributor_id', ProductDistributorDefinition::class, 'id'))->addFlags(new ApiAware(), new Inherited()),
]);
}
}
Distributor-Definition:
class ProductDistributorDefinition extends EntityDefinition
{
public const ENTITY_NAME = 'product_distributor';
...
protected function defineFields(): FieldCollection
{
return new FieldCollection([
(new IdField('id', 'id'))->addFlags(new Required(), new PrimaryKey()),
(new StringField('name', 'name'))->addFlags(new Required()),
(new OneToManyAssociationField('productExtensions', ProductExtensionDefinition::class, 'product_distributor_id', 'id'))->addFlags(new RestrictDelete(), new ReverseInherited('distributor')),
]);
}
}
Die dazugehörige Migration:
$sql = <<<SQL
CREATE TABLE IF NOT EXISTS product_extension (
id BINARY(16) NOT NULL,
product_id BINARY(16) NOT NULL,
product_version_id BINARY(16) NOT NULL,
parent_id BINARY(16) NULL,
product_distributor_id BINARY(16) NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NULL,
PRIMARY KEY (id),
CONSTRAINT FK_product_extension_product FOREIGN KEY (product_id, product_version_id)
REFERENCES product (id, version_id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FK_product_extension_distributor_id FOREIGN KEY (product_distributor_id)
REFERENCES product_distributor (id) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT FK_product_extension_parent_id FOREIGN KEY (parent_id)
REFERENCES product_extension (id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS product_distributor (
id BINARY(16) NOT NULL,
name VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SQL;
$connection->executeStatement($sql);
$this->updateInheritance($connection, 'product_extension', 'distributor');
UpdateInheritance legt zwar eine neue Spalte „distributor“ in der Tabelle „product_extension“ an, allerdings bleiben die Werte in dieser Spalte immer null, egal, ob ich per Sync-API eine neue DistributorId setze, eine parentId übertrage etc.
Weiß jemand vielleicht, wo mein (Gedanken)-Fehler liegt?
Vielen Dank und viele Grüße
Frank