Query auf Artikelattribut erweitern

Kann mir ein Doctrine-Profi einen Tipp geben? Ich habe einen Query für eine spezielle Bestellübersicht gebaut. Soweit läuft der, allerdings möchte ich die Liste noch so weit einschränken, dass nur solche Artikel gelistet werden, bei denen das Artikel-Stammdaten-Attribut attr1 (also Artikel-Freitextfeld) auf true steht. In den Order-Details ist aber keine Relation zu den Artikel-Stammdaten drin. Wie kriege ich das hin? $builder = Shopware()-\>Models()-\>createQueryBuilder(); $builder-\>select(array( 'details.id as id', 'details.articleNumber as articleNumber', 'details.articleId as articleId', 'paymentStatus.description as payment\_status', 'detailAttribute.attribute3 as lastchange', 'detailAttribute.attribute1 as status', 'detailAttribute.attribute5 as history', 'orders.orderTime as date', 'orders.number as ordernumber', 'CONCAT(CONCAT(billing.lastName, \', \'), billing.firstName) AS fullname', 'billing.company AS company' )); $builder-\>from('Shopware\Models\Order\Order', 'orders'); $builder-\>leftJoin('orders.details', 'details') -\>leftJoin('orders.paymentStatus', 'paymentStatus') -\>leftJoin('orders.billing', 'billing') -\>leftJoin('orders.orderStatus', 'orderStatus') -\>leftJoin('orders.customer', 'customer') -\>leftJoin('details.attribute', 'detailAttribute') -\>leftJoin('orders.attribute', 'attribute'); $builder-\>andWhere('orders.number \> 0');

du willst ja im Endeffekt nur auf den Table s_article_attribute zugreifen und attr1 abrufen. In der Spalte davor steht glaube die Artikelnummer und mit der kannst du ja abgleichen ob der Artikel in der Bestellung das attr1 = TRUE ist. Sollte zumindest so gehen.

Ja, so ist der Plan. Aber wie macht man das konkret? Die Relation zu den Artikel-Stammdaten und den Artikel-Attributen ist nicht im Model zu den Order Details eingetragen. Da steht nur die ID in der Order Details drin. Ich das Artikel Objekt nicht mit $builder->leftJoin(‚details.article‘, ‚article‘) dazuholen. Von den Attributen ganz zu schweigen. Ich habe es hiermit mit WITH versucht, aber das klappt nicht: $builder = Shopware()-\>Models()-\>createQueryBuilder(); $builder-\>select(array( 'details.id as id', 'details.articleNumber as articleNumber', 'details.articleId as articleId', 'paymentStatus.description as payment\_status', 'detailAttribute.attribute3 as lastchange', 'detailAttribute.attribute1 as status', 'detailAttribute.attribute5 as history', 'orders.orderTime as date', 'orders.number as ordernumber', 'CONCAT(CONCAT(billing.lastName, \', \'), billing.firstName) AS fullname', 'billing.company AS company' )); $builder-\>from('Shopware\Models\Order\Order', 'orders'); $builder-\>leftJoin('orders.details', 'details') -\>leftJoin( 'Shopware\Models\Attribute\Article', 'art', \Doctrine\ORM\Query\Expr\Join::WITH, 'art.articleID = details.articleId' ) -\>leftJoin('orders.paymentStatus', 'paymentStatus') -\>leftJoin('orders.billing', 'billing') -\>leftJoin('orders.orderStatus', 'orderStatus') -\>leftJoin('orders.customer', 'customer') -\>leftJoin('details.attribute', 'detailAttribute') -\>leftJoin('orders.attribute', 'attribute'); $builder-\>andWhere('orders.number \> 0'); $builder-\>andWhere('art.attr1 == :status'); $builder-\>setParameter('status', 'true'); Da ist auch die Frage aufgetaucht wo ich denn die Modelklasse zu den Attributen im Dateisystem finde. „Shopware\Models\Attribute\Article“ wird dafür immer angesprochen, ist aber in engine/Shopware/Models gar nicht zu finden.

Gibt es denn hierzu nun schon einen Lösungsansatz? Habe derzeit das selbe Problem…

Muss man dafür extra das Model erweitern? Oder geht es auch einfacher? Ich stehe vor einem ähnlichen Problem.

Danke im Voraus.

Ich habe jetzt das Model erweitert. Zumindest funktioniert es.

Hallo zusammen, könnte einer von euch bitte die Lösung posten ?

Ich versuche konkret an das Freitextfeld / Artikelattribut 5 zu kommen.

 $builder = Shopware()->Models()->createQueryBuilder();
        $builder->select(array('articles', 'mainDetail', 'details', 'images', 'prices', 'taxes'))
            ->from('Shopware\Models\Article\Article', 'articles')
            ->leftJoin('articles.mainDetail', 'mainDetail')
            ->leftJoin('Shopware\Models\Attribute\Article\attr5', 'details')
            ->leftJoin('details.prices', 'prices')
            ->leftJoin('articles.images', 'images')
            ->leftJoin('articles.tax', 'taxes')
            ->innerJoin('articles.allCategories', 'allCategories')
            ->where('allCategories = :categoryId')
            ->addOrderBy('articles.name', 'ASC')
            ->setParameter('categoryId', $catId);

Danke :slight_smile:

Hallo zusammen,

am Wochenenden habe ich damit auch rumgekämpft und kann definitiv sagen, dass das Model nicht erweitert werden muss. Über ein leftJoin mit der nicht vollständig assoziierten Klasse funktioniert das einwandfrei. Im folgenden Beispiel habe ich die Orderdetails mit dem Article bzw. den ArticleAttributes zusammengebracht, damit ich nur die Orderdetails anzeigen kann, die ein bestimmtes ArticleAttribute gesetzt haben.

Zu beachten ist die Auswahl der selects. Wenn hier zu viel drin steht., z.B. noch article, dann wir ein eindimensionales Array ausgegeben wo Orders und Articles im Wechsel angezeigt werden.

Hoffe das hilft dem nächsten Suchenden, denn es ist ein Graus, dass bei 80% der Fragen in diesem Forum keine sinnvolle Antwort folgt… 

$builder = $this->getEntityManager()->createQueryBuilder()
     ->select(['orders', 'details'])
     ->from(Order::class, 'orders')
     ->leftJoin('orders.details', 'details')
     ->leftJoin(Article::class, 'article', 'WITH', 'details.articleId = article.id')
     ->leftJoin('article.attribute', 'article_attributes')
     ->where('orders.customerId = :customerId')
     ->andWhere('orders.status != -1')
     ->andWhere('article_attributes.dkCustomVariantEnabled = 1')
     ->addOrderBy('orders.orderTime', 'DESC')
     ->setParameter('customerId', $customerId);