# Alle Varianten eines Produktes laden (PHP)

**URL:** <https://forum.shopware.com/t/alle-varianten-eines-produktes-laden-php/90809>\
**Category:** Programmierung\
**Tags:** programming\
**Created:** [11. Oktober 2021 um 14:33 UTC](https://forum.shopware.com/t/alle-varianten-eines-produktes-laden-php/90809 "2021-10-11T14:33:55Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Simon\_Kohl](https://avatars.discourse-cdn.com/v4/letter/s/45deac/32.png) [@Simon\_Kohl](https://forum.shopware.com/u/Simon_Kohl)\
**Post date:** [11. Oktober 2021 um 14:33 UTC](https://forum.shopware.com/t/alle-varianten-eines-produktes-laden-php/90809/1 "2021-10-11T14:33:55Z")

</div>

Ich möchte alle Varianten eines Produktes laden.

Nachdem ich schon etwas gegooglet habe, habe ich diesen Code zusammen:

```auto
class ProductViewSubscriber implements EventSubscriberInterface
{
    private EntityRepositoryInterface $productRepository;

    public function __construct(EntityRepositoryInterface $productRepository)
    {
        $this->productRepository = $productRepository;
    }

    public function getVariantsOfProduct(SalesChannelProductEntity $product, Context $context): EntitySearchResult
    {
        $parentProduct = $product->getParent();
        if ($parentProduct != null) {
            // Wir brauchen das Parent Product um die Varianten des Objektes herauszufinden
            $product = $parentProduct;
        }
        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('product.parentId',
            $product->getProductNumber()));
        return $this->productRepository->search(new Criteria(), $context);
    }

    public static function getSubscribedEvents(): array
    {
        return [
            ProductPageLoadedEvent::class => ['addVariants'],
        ];
    }

    public function addVariants(ProductPageLoadedEvent $pEvent)
    {
        $products = $this->getVariantsOfProduct($product = $pEvent->getPage()->getProduct(), $pEvent->getContext());
        $matchingVariants = $products->getElements();
    }
}

```

Anders als Online beschrieben enthält $matchingVariants aber nicht nur die Varianten sondern alle Produkte des Shops. Wie kann der Code geändert werden, dass nur die Produkte geladen werden, die Varianten des Produkts sind, für welches das ProductPageLoadedEvent ausgeführt wird?

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [11. Oktober 2021 um 15:31 UTC](https://forum.shopware.com/t/alle-varianten-eines-produktes-laden-php/90809/2 "2021-10-11T15:31:13Z")

</div>

return $this-\>productRepository-\>search(new Criteria(), $context);

ist der Fehler drin… du hast ja ein Criteria die Zeile darüber erstellt $criteria

Korrekt:

return $this-\>productRepository-\>search($criteria, $context);

---

<div class="post-metadata">

**Author:** ![Simon\_Kohl](https://avatars.discourse-cdn.com/v4/letter/s/45deac/32.png) [@Simon\_Kohl](https://forum.shopware.com/u/Simon_Kohl)\
**Post date:** [13. Oktober 2021 um 12:56 UTC](https://forum.shopware.com/t/alle-varianten-eines-produktes-laden-php/90809/3 "2021-10-13T12:56:25Z")

</div>

Mit meinem verändertem code sagt er mir jetzt, dass gar keine Produkte existieren würden. Mache ich irgendetwas mit den Filtern falsch?

```auto
class ProductViewSubscriber implements EventSubscriberInterface
{
    private EntityRepositoryInterface $productRepository;

    public function __construct(EntityRepositoryInterface $productRepository)
    {
        $this->productRepository = $productRepository;
    }

    public function getVariantsOfProduct(SalesChannelProductEntity $product, Context $context): EntitySearchResult
    {
        $parentProduct = $product->getParent();
        if ($parentProduct != null) {
            // Wir brauchen das Parent Product um die Varianten des Objektes herauszufinden
            $product = $parentProduct;
        }
        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('product.parentId',
            $product->getUniqueIdentifier()));
        return $this->productRepository->search($criteria, $context);
    }

    public static function getSubscribedEvents(): array
    {
        return [
            ProductPageLoadedEvent::class => ['addVariants'],
        ];
    }

    public function addVariants(ProductPageLoadedEvent $pEvent)
    {
        $products = $this->getVariantsOfProduct($product = $pEvent->getPage()->getProduct(), $pEvent->getContext());
        $matchingVariants = $products->getElements();
    }
}

```

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [13. Oktober 2021 um 21:22 UTC](https://forum.shopware.com/t/alle-varianten-eines-produktes-laden-php/90809/4 "2021-10-13T21:22:54Z")

</div>

Ohne die Datenbankstruktur im Kopf zu haben… du sucht product.parentId = $product-\>getUniqueIdentifier(). Sprich die id des Parent soll gleich der id des aufgerufenen Produkts sein… glaube nicht, dass das Sinn ergibt.

Kann aber auch gut sein, dass ich das gerade falsch lese. Müsste mich selbst erst einlesen, was mein Zeitlimit leider sprengen würde 😆 Sorry.
