Hallo, ich will in meinem Plugin von einer Category alle Produkte ziehen, Qry Builder beispiel public function getPB100() { $articleRepo = Shopware()-\>Models()-\>getRepository("Shopware\Models\Article\Article"); $articles = $articleRepo-\>createQueryBuilder(array('articles', 'mainDetail', 'prices', 'tax', 'images', 'links', 'linkAttribute', 'imageAttribute', 'propertyValues' )) -\>from('Shopware\Models\Article\Article', 'articles') -\>innerJoin('articles.allCategories', 'allCategories') -\>leftJoin('articles.mainDetail', 'mainDetail') -\>innerJoin('mainDetail.prices', 'prices') -\>leftJoin('articles.tax', 'tax') -\>leftJoin('articles.images', 'images') -\>leftJoin('articles.links', 'links') -\>leftJoin('links.attribute', 'linkAttribute') -\>leftJoin('images.attribute', 'imageAttribute') -\>leftJoin('articles.propertyValues', 'propertyValues') -\>where('articles.active = :active') -\>andWhere('images.parentId IS NULL') -\>andWhere('allCategories = :categoryId') -\>addOrderBy('mainDetail.releaseDate', 'DESC') -\>setParameter('active',1) -\>setParameter('categoryId', '231') -\>setFirstResult(0) -\>setMaxResults(20) -\>getQuery() -\>getArrayResult(); return $articles; }
Lustigerweise schmiert mir der Server ab da ich zuviele Produkte habe. Es scheint so als ob sie das Query alle Produkte holt und dann nach der categoryId 231 sortiert. Ich brauch nur die Produkte mit den details die hier geholt werden von der Kategorie 231 Das setMAxResults 20 gibt mir lustigerweise nur 1 Produkt zurück obwohl 17 in der Category sind. sobald ich das setMaxResults entferne läd der Shop lange oder schmiert ab, aber er zeigt alle Produkte der Kategorie 231 an. Hilfe ?
Hi, grundsätzlich kann man da sicher auch am Doctrine-Query optimieren, bspw. benutzt du „setMaxResult“ in einem Query mit toMany-Relationen - das führt ohne den Doctrine Paginator immer potenziell zu Problemen, weil der die Limitierung auf Row-Basis macht und damit nicht (nur) die Produkte limitiert, sondern auch die Preise, Kategorien, Bilder etc. So erhältst du dann nicht 20 Produkte, sondern bspw. ein Produkt mit maximal 20 Bildern, Preisen, Kategorien. Um sowas zu umgehen, gibt es Shopware()->Models()->createPaginator. So oder so würde ich im Frontend aber eher empfehlen, die neuen StoreFront-Bundles zu nutzen: $context = $this-\>get('shopware\_storefront.context\_service')-\>getProductContext(); $search = $this-\>get('shopware\_search.product\_search'); $criteria = new \Shopware\Bundle\SearchBundle\Criteria(); $criteria-\>addCondition(new \Shopware\Bundle\SearchBundle\Condition\CategoryCondition([3])); $searchResult = $search-\>search( $criteria, $context );
Das sollte ziemlich genau das machen, was du suchst - in diesem Fall für die Kategorie mit der ID 3. Besten Gruß, Daniel