Produkt Slider auf Detailseite einbinden mit nur einem Child pro Parent

Hallo,

ich habe über ein Plugin den product slider auf der Detailseite eingebunden. Um die Produktdaten zu laden benutze ich das SalesChannelRespository, welches beim ProductPageLoadedEvent einige Artikel lädt (via search function). Diese Artikel gebe ich als page extension weiter:

$event->getPage()->addExtension('my-extension', new ArrayStruct($myProducts, 'myArrayStruct'));

Auf der Detailseite binde ich dann einen product-slider ein:

{% set config = {
            'title': {
                'value': 'slider.title' | trans
            },
            'border': {
                'value': false
            },
            'rotate': {
                'value': false
            },
            'products': {
                'value': page.extensions['my-extension'].all
            },
            'boxLayout': {
                'value': 'standard'
            },
            'elMinWidth': {
                'value': '300px'
            },
            'navigation': {
                'value': true
            },
            'displayMode': {
                'value': 'minimal'
            },
            'verticalAlign': {
                'value': 'top'
            },
        } %}
        {% sw_include "@Storefront/storefront/element/cms-element-product-slider.html.twig" with {
            sliderConfig: config,
            element: {
                'data': {
                    'products': {
                        elements: page.extensions['my-extension'].all
                    }
                },
                type: 'product-slider'
            }
        } %}

Das funktioniert hervorragend, allerdings bekomme ich teilweise zum gleichen parent viele verschiedene children. Ich würde gerne erreichen, dass pro parent nur ein child aufgelöst wird. Unsere children sind im Grunde nur unterschiedliche Farben, es wäre aber interessanter, verschiedenere Produkte anzuzeigen.

Ist das möglich? Ich habe das Gefühl, dass Shopware 6, wenn ich selbst eine dynamische Produktgruppe erstelle und diese mit einem Produkt Slider in einer Landingpage verknüpfe schon nur ein Child pro parent anzeigt. Nur mit dem Sales Channel Repository scheint das nicht so zu funktionieren.

Einfach bei RepositoryResult die Kinder, bis auf eines, filtern.

Hallo,

ich hatte die Hoffnung, dass es einen effizienteren Weg gibt, als das Result Set zu filtern. Natürlich kann ich darüber loopen etc. aber wenn ich z.B. nur 10 Artikel in den Slider packen will, kann ich die criteria nicht auf 10 limitieren (weil ich danach noch filtere). Ich muss mir also eine Zahl ausdenken… Hinzu kommt das der Loop redundant ist.

Trotzdem vielen Dank erstmal

In MySQL gibt es ja auch eine UNIQOUE bzw DISTINCT Funktion. Die ist meinem Wissen nach im Repository mit integriert. Einfach mal nachsehen, ob die clever angewandt werden kann, ohne im Nachhinein zu filtern.

Leider ist das ja keine einfache distinct relation. Distinct würde ja auf das gesamt result set angewandt werden. Ergo würde jedes Ergebnis distinct sein, weil ja mindestens die productId des childs jeweils eine andere wäre. In Sql würde ich das mit einer Subquery lösen (wobei die technisch ja auch eine Art loop ist, mit deutlich höherer Laufzeit, weil die Subquery auf jedes Element angewendet wird).

Um das noch einmal zu verdeutlichen: Ich suche nach einem technisch billigen Algorithmus. Weil Shopware so etwas schon in der CMS Anwendung des product sliders hat (s. dynamische Produktgruppen) habe ich die Vermutung, dass es hier eine bessere Möglichkeit geben könnte, als Subqueries und loops. Letztendlich könnte man so etwas ja in der Model Definition festhalten, ich finde aber nichts in den Entity definitionen.

Dann schau doch einfach in den entsprechenden Quelltext, wenn dort die Lösung steckt. Auf Github findest du entsprechenden Code schnell über die Suche.