Hallo, das Plugin unter http://wiki.shopware.de/Fortgeschritten … _1028.html holt sich ja die Daten aus dem View und reichert diese in einer Foreach Schleife an. Ist sowas nicht super infperformant, weil 16x ein Query abgefeuert wird? Hätte man nicht besser einmal die Daten holen können um diese dann zu verteilen? Gruß, Michael public function onFrontendPostDispatch(Enlight\_Event\_EventArgs $arguments) { /\*\*@var $controller Shopware\_Controllers\_Frontend\_Index \*/ $controller = $arguments-\>getSubject(); $view = $controller-\>View(); $request = $controller-\>Request(); if ($request-\>getControllerName() !== 'listing' || $request-\>getModuleName() !== 'frontend' || !$view-\>hasTemplate()) { return; } $articles = $view-\>getAssign('sArticles'); foreach($articles as &$article) { if (!$article['sConfigurator']) { continue; } $article['swagVariantsInListing'] = $this-\>getArticleConfiguration($article['articleID']); } //Add our plugin template directory $view-\>addTemplateDir($this-\>Path() . 'Views/'); $view-\>extendsTemplate('frontend/listing/extension.tpl'); $view-\>assign('sArticles', $articles); }
wie soll das funktionieren? 1mal die Daten holen. über das ORM wird das nicht klappen - über SQL könnte man so etwas machen wie SELECT \* FROM s\_articles WHERE id IN (44,55,77,99)
dann hätte man in dem Fall 4 aber ohne Relations ohne Langtexte, Bilder, etc… Wenn ich also Nutzen und Performance aufwiege ist die Vorgehensweise seitens Shopware besser
Hallo, genau das hatte ich vermutet. Ich würde dann aber so vorgehen, dass ich mir alle ArtikelIDs hole und im Nachgang via “id IN ()” mir für ALLE Artikel in einem Schlag die Daten hole und die sArticle aus dem View anreichere. Derzeit ist es ja auch so, dass im foreach() auch einzeln die Bilder/Preise usw. geholt werden, was ja doch eine ganze Menge an Querys erzeugt. Das ist natürlich alles die Schattenseite der Kapselung/Abstraktion von Funktionalität Gruß, Michael
naja du könntest zwar per SQL IN() direkt mehrere Daten holen bräuchtest aber trotzdem mehr als eine SQL Anweisung. (s_articles, s_articles_detail, s_articles_configuration_*) da würde ich lieber das Caching aktivieren HTTP-Front-Cache und APC - dann wird es eh nicht mehr aus der Datenbank geholt
Hi, hier gibt es verschiedene Meinungen, Erfahrungen. Oftmals ist es meiner Erfahrung nach sogar schneller wenn man lieber 5-6 einzelne Queries macht die sauber über Primary und Foreign Keys laufen als wenn man alle Daten in einem riesigen Statement holt. Gutes Beispiel sind Sortierungen. Wenn du die Artikel Daten von 30x Artikeln selektierst + alle zusätzlichen Daten, wird das Resultset das SQL filtern und sortieren muss natürlich immer größer und größer. Und je größer die Menge an Daten ist, die SQL sortieren muss, desto länger dauert die Query, desto mehr nachfolgende Queries laufen in die Warteschleife. Das gleiche ist bei Doctrine. Damit Doctrine die Daten als verschachteltes Array zurück liefert, iteriert Doctrine die Daten. Je mehr Assoziationen du verknüpfst desto länger brauch Doctrine um die Daten aufzubereiten. Gruß Oliver