Like Statement mit Query Builder schlägt fehl

Hi zusammen, ich bastele gerade an einem Farbwähler für die Artikeldetailansicht und baue mir gerade hierfür das JSON Objekt zusammen, was bis auf einen LIKE Anweisung mit dem Query Builder nicht funktioniert. Ich möchte mit dem Like Statement auf die ordernumber in der s_articles_details zugreifen, was mir allerdings mit einer Fehlermeldung quittiert wird. Hier ist die entsprechende Funktion: /\*\* \* Helper method which returns a Query object in order to select the required variant data \* \* @param $articleId \* @param $selectedValue \* @return Doctrine\ORM\Query \*/ protected function getVariantsQuery($articleId, $selectedValue) { /\*\* @var $article Shopware\Models\Article\Article \*/ $article = Shopware()-\>Models()-\>find( '\Shopware\Models\Article\Article', $articleId ); $builder = Shopware()-\>Models()-\>createQueryBuilder(); $builder-\>select(array('detail', 'options')) -\>from('Shopware\Models\Article\Detail', 'detail') -\>leftJoin('detail.configuratorOptions', 'options') -\>where('detail.articleId = :articleId') -\>andWhere('detail.active = true ') -\>setParameters(array('articleId' =\> $articleId)); if (!empty($selectedValue)) { $builder-\>andWhere('detail.ordernumber LIKE ?1') -\>setParameter('1', '%' . $this-\>colorSeparator . $selectedValue . $this-\>colorSeparator . '%'); } if ($article-\>getLastStock()) { $builder-\>andWhere('detail.inStock \> 0'); } //die( $builder-\>getQuery()-\>getSQL()); return $builder-\>getQuery(); } Es geht umd den Part: if (!empty($selectedValue)) { Hat jemand eine Idee, woran das Vorhaben hier scheitert? Vielen Dank und viele Grüße, Chris

[quote=“coarsy”]was mir allerdings mit einer Fehlermeldung quittiert wird.[/quote] Die Fehlermeldung solltest du uns nicht verschweigen :slight_smile: Poste auch mal die fertige query: echo $builder-\>getQuery()-\>getSQL(); Viele Grüße

Ah, ich habe im Model nachgesehen, die Spalte odernumber wird mit number “übersetzt”, somit ist das Problem erstmal behoben und ich kann den Variantenselector mit jQuery bauen, da die Ausgabe nun korrekt ist. Ich danke Dir für die Rückmeldung.

Hi nochmal, jetzt bin ich immer noch an einem ähnlichen Problem, was auch diesen Query anbelangt: Da die Varianten auch unterschiedliche Preise haben, möchte ich diese ebenfalls noch in JSON Objekt überführen, was mir auch damit gelingt: protected function getVariantsQuery($articleId, $selectedValue) { /\*\* @var $article Shopware\Models\Article\Article \*/ $article = Shopware()-\>Models()-\>find( '\Shopware\Models\Article\Article', $articleId ); $builder = Shopware()-\>Models()-\>createQueryBuilder(); $builder-\>select(array('details', 'options', 'prices')) -\>from('Shopware\Models\Article\Detail', 'details') -\>leftJoin('details.configuratorOptions', 'options') -\>leftJoin('details.prices', 'prices') -\>where('details.articleId = :articleId') -\>andWhere('details.active = true') -\>setParameters(array('articleId' =\> $articleId)); if (!empty($selectedValue)) { $builder-\>andWhere('details.number LIKE ?1') -\>setParameter('1', '%' . $this-\>colorSeparator . $selectedValue . $this-\>colorSeparator . '%'); } if ($article-\>getLastStock()) { $builder-\>andWhere('details.inStock \> 0'); } //add order by conditions for the correct display order $builder-\>addOrderBy('options.groupId', 'ASC'); $builder-\>addOrderBy('details.number', 'ASC'); //die( $builder-\>getQuery()-\>getSQL()); return $builder-\>getQuery(); } Allerdings habe ich nun das Problem, dass ja sämtliche Preise mit übertragen werden. Gibts irgendwie im Query Builder die Möglichkeit, die zu selektierenden Spalten einzuschränken? Denn ich bräuchte von der kompletten Tabelle lediglich den Preis (eigentlich brutto)

Hier findest du die Dokumentation zum doctrine query builder: http://doctrine-orm.readthedocs.org/en/ … ilder.html Dabei könnte insbesondere das hier für dich interessant sein: // Example - $qb-\>leftJoin('u.Phonenumbers', 'p', Expr\Join::WITH, $qb-\>expr()-\>eq('p.area\_code', 55)) // Example - $qb-\>leftJoin('u.Phonenumbers', 'p', 'WITH', 'p.area\_code = 55') // Example - $qb-\>leftJoin('u.Phonenumbers', 'p', 'WITH', 'p.area\_code = 55', 'p.id') public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null); Viele Grüße

Ich danke Dir, ich schaus mir in Ruhe an, was mir allerdings noch mehr Sorgen bereitet ist die fehlerhafte Sortierung der Varianten, was insbesondere bei den Größen auffällt, da diese dummerweise in der Reihenfolge L, M etc. ausgegeben werden und nicht nach der Order im Backend. Siehe: http://shopware.p123341.webspaceconfig. … 0-den.html Vielleicht habt Ihr hier noch eine Idee?

So, hab mir jetzt die Doku angesehen und längere Zeit rumprobiert, aber die Sache funktioniert nicht, das heißt, ich kann die Artikelpreistabelle nicht auf eine einzige Spalte einschränken. So hab ichs probiert und bin kläglich gescheitert: $builder-\>select(array('details', 'options', 'prices')) -\>from('Shopware\Models\Article\Detail', 'details') -\>leftJoin('details.configuratorOptions', 'options') -\>leftJoin('details.configuratorOptions', 'groups') -\>leftJoin('details.prices', 'prices', 'WITH', 'prices.price') -\>where('details.articleId = :articleId') -\>andWhere('details.active = true') -\>setParameters(array('articleId' =\> $articleId));

Mit dem 4. Parameter “condition” kannst du den join eingrenzen - zb “price.customergroup = EK” Viele Grüße

Vielen Dank für Deine Antwort, ich möchte aber nicht auf eine Bedingung einschränken, sondern aus der Tabelle der Artikelpreise nur die Spalte prices, da ja ansonsten auch Einkaufspreise öffentlich einsehbar wären, wenn sich jemand mit JSON und Co. auskennt :wink:

Hmmm, wenn ich $builder->select(array(‚details‘, ‚options‘, ‚prices.price‘)) verwende, gibts zwar nur den Preis aus der Preistabelle, dafür stimmt der Rest dann nicht mehr…

Ok… Ich habe nun keine Ahnung, was du überhaupt möchtest. Bitte poste mal deine gewünschte Ergebnissmenge. Viele Grüße

Sodalle, wenn Du Dir das Ergebnis als JSON ansiehst, dann siehst Du, dass die vorhin gepostete Abfrage, welche dieser Controller liefer, zuviel des Guten liefert: http://shopware.p123341.webspaceconfig. … icleId=145 Mein Join auf die s_articles_prices liefert eben alle Spalten dieser Tabelle, ich möchte hiervon aber nur den „price“ haben. Danke fürs Gucken! Vielleicht sollte ich das Statement ohne den Builder, sondern straight schreiben? Hier ist nochmal der Query, und das Ergebnis, dass ich nicht haben möchte: Query: $builder = Shopware()-\>Models()-\>createQueryBuilder(); $builder-\>select(array('details', 'options', 'prices')) -\>from('Shopware\Models\Article\Detail', 'details') -\>leftJoin('details.configuratorOptions', 'options') -\>leftJoin('details.prices', 'prices') -\>where('details.articleId = :articleId') -\>andWhere('details.active = true') -\>setParameters(array('articleId' =\> $articleId)); Ergebnis: "id":858,"articleId":145,"unitId":null,"number":"WI-5652-0200-3840","supplierNumber":"","kind":2,"additionalText":"schwarz|38-40","active":1,"inStock":6,"stockMin":0,"weight":"0.000","width":"0.000","len":"0.000","height":"0.000","ean":"","position":0,"minPurchase":null,"purchaseSteps":null,"maxPurchase":null,"purchaseUnit":"1.0000","referenceUnit":null,"packUnit":"st\u00fcck","shippingFree":false,"releaseDate":{"date":"1999-11-30 00:00:00","timezone\_type":3,"timezone":"Europe\/Berlin"},"shippingTime":"0","configuratorOptions":[{"id":8,"groupId":1,"name":"schwarz","position":1},{"id":48,"groupId":2,"name":"38-40","position":1}],"prices":[{"id":858,"articleId":145,"articleDetailsId":858,"customerGroupKey":"EK","from":1,"to":"beliebig","price":4.1176470588235,"pseudoPrice":0,"basePrice":1.4,"percent":0}],"cover":{"src":{"original":"http:\/\/shopware.p123341.webspaceconfig.de\/media\/image\/silhouette\_fh\_831.jpg","0":"http:\/\/shopware.p123341.webspaceconfig.de\/media\/image\/thumbnail\/silhouette\_fh\_831\_30x30.jpg","1":"http:\/\/shopware.p123341.webspaceconfig.de\/media\/image\/thumbnail\/silhouette\_fh\_831\_57x57.jpg","2":"http:\/\/shopware.p123341.webspaceconfig.de\/media\/image\/thumbnail\/silhouette\_fh\_831\_105x105.jpg","3":"http:\/\/shopware.p123341.webspaceconfig.de\/media\/image\/thumbnail\/silhouette\_fh\_831\_280x370.jpg","4":"http:\/\/shopware.p123341.webspaceconfig.de\/media\/image\/thumbnail\/silhouette\_fh\_831\_500x750.jpg","5":"http:\/\/shopware.p123341.webspaceconfig.de\/media\/image\/thumbnail\/silhouette\_fh\_831\_900x1100.jpg"},"res":{"original":{"width":600,"height":848},"description":""},"position":1,"extension":"jpg","main":1,"id":141,"parentId":null,"attribute":[]}},{"id":860,"articleId":145,"unitId":null,"number":"WI-5652-0200-4244","supplierNumber":"","kind":2,"additionalText":"schwarz|42-44","active":1,"inStock":0,"stockMin":0,"weight":"0.000","width":"0.000","len":"0.000","height":"0.000","ean":"","position":0,"minPurchase":null,"purchaseSteps":null,"maxPurchase":null,"purchaseUnit":"1.0000","referenceUnit":null,"packUnit":"st\u00fcck","shippingFree":false,"releaseDate":{"date":"1999-11-30 00:00:00","timezone\_type":3,"timezone":"Europe\/Berlin"},"shippingTime":"0","configuratorOptions":[{"id":8,"groupId":1,"name":"schwarz","position":1} Beim Prices Array möchte ich eben nur den Price ohne den ganzen anderen Kram…

[quote=„coarsy“]Allerdings habe ich nun das Problem, dass ja sämtliche Preise mit übertragen werden. Gibts irgendwie im Query Builder die Möglichkeit, die zu selektierenden Spalten einzuschränken?[/quote] Dann verstehe ich diese Aussage nicht… Aber ok - du hast mehrere Möglichkeiten. Hier sind drei Beispiele: 1. Partial objects: $builder-\>select( "partial details.{id}" ); Siehe: http://doctrine-orm.readthedocs.org/en/ … jects.html und: http://doctrine-orm.readthedocs.org/en/ … guage.html 2. Setze die Preis-Tabelle als Ausgangspunkt: $builder-\>from( "Shopware\Models\Article\Price", "prices" ) -\>where( "prices.article = :article" ) -\>setParameter( "article", Shopware()-\>Models-\>find( "\Shopware\Models\Article\Article", $articleId ) ); 3. Gib die gefundenen Elemente nicht stumpf aus, sondern kürze die Daten via PHP. Viele Grüße

1 Like

Guten Morgen Aquatuning, habe schon alle Möglichkeiten ausprobiert, wobei die 3 te nicht in Frage kommt, weil es meiner Meinung nach unsauber ist, ein von vornherein einschränkbares Ergebnis im Nachhinein zu manipulieren. Deswegen habe ich folgendes probiert, was leider auch nicht tut: $builder = Shopware()-\>Models()-\>createQueryBuilder(); $builder-\>select('details', 'options', 'partial prices.{price}') -\>from('Shopware\Models\Article\Detail', 'details') -\>leftJoin('details.configuratorOptions', 'options') -\>leftJoin('details.prices', 'prices') -\>where('details.articleId = :articleId') -\>andWhere('details.active = true') -\>setParameters(array('articleId' =\> $articleId)); Möglichkeit 2 kapiere ich ehrlich gesagt nicht, da ja zum Artikel die Zusatzinfos wie Preis etc. abgefragt werden sollen und nicht umgekehrt. Irgendwie bin ich mit Doctrine noch auf Kriegsfuß, bzw. der Query Builder ist mir noch zu schräg :wink: Im Prinzip brauche ich ja nur sowas wie: SELECT tb1.\*, tb2.x FROM tableA tb1 LEFT JOIN tableB tb2 ON tb1.a = tb2.a

So, ich habs, es muss unbedingt die ID mit übergeben werden, sonst gibts nen Fehler. $builder-\>select(array('details', 'options' , 'partial prices.{id, price}')) Jetzt fehlt nur noch die Sache mit der fehlerhaften Sortiertung der Optionen, soll ich hierzu nen eigenen Thread eröffnen?

Noch ne Frage zur selben Thematik. Kann man den AJAX Request irgendwie beschleunigen? Bei OXID bin ich zwar über die API, aber nicht über den MVC gegangen, da die Performance dann ähnlich war wie jetz > 800 ms. Ohne Verwendung des MVC kam ich bei OXID auf 200 ms für jeden Request, was man natürlich spürbar im Frontend merkt.