ManyToManyAssociationField Fehler

Ich habe in meiner custom EntityDefinition ein ManyToManyAssociationField:

(new ManyToManyAssociationField('assignedProducts', ProductDefinition::class, ProductBadgeAssignedProductsDefinition::class, 'product_badge_id', 'product_id')),

Viele Product-Badges können viele Products haben. Also habe ich noch eine Product Extension hinzugefügt:

class ProductExtension extends EntityExtension
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            (new ManyToManyAssociationField(
                'productBadges',
                ProductBadgeDefinition::class,
                ProductBadgeAssignedProductsDefinition::class,
                'product_id',
                'product_badge_id'
            ))->addFlags(new Inherited())
        );
    }
    

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

Meinen Product Badges kann ich auch Produkten zuordnen. Möchte ich jetzt aber ein Produkt speichern, hat der Request /api/_action/sync einen Error:

An exception occurred while executing '
UPDATE `product` SET `productBadges` = IFNULL(
    (
        SELECT `kk_product_badge_assigned_products`.`product_id`
        FROM   `kk_product_badge_assigned_products`
        WHERE  `kk_product_badge_assigned_products`.`product_id`         = `product`.id
        AND `kk_product_badge_assigned_products`.`product_version_id` = `product`.version_id
        LIMIT 1
    ),
    IFNULL(`product`.parent_id, `product`.id)
)
WHERE `product`.id IN (?, ?)
AND `product`.version_id = ?' with params ["\u00...fa", "\x0f...\x25"]:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'productBadges' in 'field list'

Dadurch wird jetzt z.B. availableStock nicht aktualisiert…

Warum will der denn jetzt überhaupt das Feld productBadges aktualisieren? Das ist doch nur eine Association auf beiden Seiten…

Hab mich grad wegen einem ähnlichen Problem durch den Code gegraben, Auslöser ist der InheritanceUpdater (aufgerufen durch den ProductIndexer), der alle Vererbungen aktualisiert (dein ManyToMany ist „Inherited“). Offensichtlich fehlt das Feld productBadges in der Tabelle product. Wird normalerweise mit $this->updateInheritance($connection, 'product', 'productBadges'); in der Migration erledigt.

1 Like

Ah stimmt, in der Reversed–Assosiation brauche ich das ja auch gar nicht. Habe es rausgenommen und jetzt funktioniert es. Vielen Dank!