Umgang mit version_id in eigenen Extensions

Hallo liebe Community,

in meinem Plugin versuche ich das Datenmodel so zu erweitern, dass ich einem Produkt Kundengruppen (Mehrzahl!) zuweisen kann. Die Erweiterung sieht, bis jetzt so aus:
Neue Entität:
Collection:

class ProductCustomerGroupCollection extends EntityCollection
{
    protected function getExpectedClass(): string
    {
        return ProductCustomerGroupEntity::class;
    }
}

Definition:

class ProductCustomerGroupDefinition extends EntityDefinition
{
    public const ENTITY_NAME = 'ust_product_customer_group';

    public function getEntityName(): string
    {
        return self::ENTITY_NAME;
    }

    public function getCollectionClass(): string
    {
        return ProductCustomerGroupCollection::class;
    }

    public function getEntityClass(): string
    {
        return ProductCustomerGroupEntity::class;
    }

    protected function defineFields(): FieldCollection
    {
        return new FieldCollection([
            (new FkField('product_id', 'productId', ProductDefinition::class))->addFlags(new Required(), new PrimaryKey()),
            (new FkField('customer_group_id', 'customerGroupId', CustomerGroupDefinition::class))->addFlags(new Required(), new PrimaryKey()),
            (new CreatedAtField())->addFlags(new ApiAware()),
            (new UpdatedAtField())->addFlags(new ApiAware()),

            new ManyToOneAssociationField('product', 'product_id', ProductDefinition::class),
            new ManyToOneAssociationField('customerGroup', 'customer_group_id', CustomerGroupDefinition::class),
        ]);
    }
}

und Entity:

class ProductCustomerGroupEntity extends Entity
{
    protected string $productId;
    protected string $customerGroupId;

    public function getProductId(): string
    {
        return $this->productId;
    }

    public function setProductId(string $productId): void
    {
        $this->productId = $productId;
    }

    public function getCustomerGroupId(): string
    {
        return $this->customerGroupId;
    }

    public function setCustomerGroupId(string $customerGroupId): void
    {
        $this->customerGroupId = $customerGroupId;
    }
}

Und dann habe ich die Product-Entity durch diese Extension erweitert:

class ProductExtension extends EntityExtension
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            (new ManyToManyAssociationField(
                'customerGroups',
                CustomerGroupDefinition::class,
                ProductCustomerGroupDefinition::class,
                'product_id',
                'customer_group_id',
            ))->addFlags(new CascadeDelete())
        );
    }

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

Die Tabelle „ust_product_customer_group“ wurde in einer entsprechenden Migration angelegt. Auch wurde die Administration angepasst, sodass ich nun einem Produkt Kundengruppen zuweisen kann.

Zum Problem:
Ich versuche im Listing Produkte auf Kundengruppen einschränken, und zwar so:

public function onProductListingCriteria(ProductListingCriteriaEvent $event): void
    {
        $criteria = $event->getCriteria();
        $context = $event->getSalesChannelContext();
        
        // Aktuelle Kundengruppe holen
        $customerGroupId = $context->getCurrentCustomerGroup()->getId();

        // Association hinzufügen
        $criteria->addAssociation('customerGroups');

        // Produkte ausschließen, die der aktuellen Kundengruppe zugewiesen sind
        $criteria->addFilter(new NotFilter(
            NotFilter::CONNECTION_AND,
            [new EqualsFilter('customerGroups.id', $customerGroupId)]
        ));
       
    }

Das führt zum Fehler:

An exception occurred while executing a query: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'product.customerGroups.mapping.product_version_id' in 'field list'

Es scheint also irgendetwas mit der „version_id“ zutun zu haben. Aber ich will meine Kundengruppen gar nicht an eine bestimmte „Version“ des Produktes hängen, sondern an das Produkt selbst. Oder verstehe ich das Konzept falsch? Wie setze ich meine Anforderung um?
Soll ich in der Tabelle „ust_product_customer_group“ die „product_version_id“ hinzufügen? Was ist aber, wenn die version_id des Produktes sich ändert, dann verliere ich doch alle meine Referenzen zu Kundengruppen?
Oder kann ich meine Criteria so definieren, dass Shopware die version_id nicht automatisch in der Abfrage einbaut? Geht das?

Nochmal zur Klärung - die Anforderung ist einem Produkt Kundengruppen zuweisen zu können und dann, Produkte per Criteria auf bestimmte Kundengruppen im Listing (und später in der Suche) einzuschränken.

Danke im Voraus,
Nikolaj

Die version_id wird meines Wissens bei den Produkten bis heute nicht wirklich genutzt, ist aber notwendig bei Referenzen auf product. Bisher wird das meine ich nur bei Bestellungen wirklich verwendet. Und es würde bei einer Änderung nicht zum Verlust der Zuordnung führen, da die aktuelle Version immer dieselbe feste ID (LIVE_VERSION, 0FA91CE3E96A4BC2BE4BD9CE752C3425) hat und die alte Version eine „neue“ ID bekommt. Ich hoffe, das ist verständlich.

1 „Gefällt mir“

Vielen Dank Anotherone für die schnelle Antwort! Dann füge ich meiner Erweiterung noch die Productversion-Spalte hinzu und schaue wie es sich verhält..