QueryBuilder - Bestellungen

Hallo, es geht mir hierbei um die Erweiterung eines bestehenden QueryBuilders. Ich erstelle bei der Installation ein neues Attribute Feld. Dies nennt sich ‘futiShoeSize’ und wird in der Tabelle ‘s_order_details_attributes’ angelegt. $this-\>Application()-\>Models()-\>addAttribute( 's\_order\_details\_attributes', 'futi', 'shoe\_size', 'int(11)', true, null ); Dieses Feld soll nun in die bestehende Abfrage hinzugefügt werden. Mein aktuelle Versuch sieht so aus. $events[] = $this-\>createEvent('Shopware\Models\Order\Repository::getOrdersQueryBuilder::after','getOrdersQueryBuilder'); public function getOrdersQueryBuilder(Enlight\_Hook\_HookArgs $arguments) { // get original builder $builder = $arguments-\>getReturn(); $builder-\>addSelect(array('futiShoeSize')) -\>from('Shopware\Models\Attribute\OrderDetail', 'orderDetailAttribute') -\>leftJoin('orderDetailAttribute.futiShoeSize', 'futiShoeSize'); $arguments-\>setReturn($builder); } Leider erhalte ich immer folgendes {"success":false,"data":[],"message":"[Semantical Error] line 0, col 1230 near 'futiShoeSize': Error: Class Shopware\\Models\\Attribute\\OrderDetail has no association named futiShoeSize"} Kann mir eventuell jemand sagen was ich bei dem addSelect genau falsch mache? Ich muss zugeben das ist für mich noch etwas Neuland :wink: Danke im Voraus :slight_smile:

ich glaube, dass deine Spalte in den Attributen nicht futiShoeSize sondern futi\_ShoeSize heisst. bin mir nicht 100%ig sicher aber ich glaube dass die Attributfelder aus [Prefix]\_[Spaltenname] bestehen. Das müsstest du aber in der Datenbank Tabelle s_order_details_attributes sehen

ja ich hatte recht :wink: siehe https://github.com/ShopwareAG/shopware- … r.php#L378

Hi, ersteinmal danke. Aber leider ändert sich mein Problem nicht. Wenn ich in die \Shopware\Models\Attribute\OrderDetail.php schaue finde ich folgende Einträge: /\*\* \* @var integer $futiShoeSize \* \* @ORM\Column(name="futi\_shoe\_size", type="integer", nullable=true) \*/ protected $futiShoeSize public function getFutiShoeSize() { return $this-\>futiShoeSize; } public function setFutiShoeSize($futiShoeSize) { $this-\>futiShoeSize = $futiShoeSize; return $this; } Ich hab jetz gerade mal ‘futi_shoe_size’ versucht. Leider erhalte ich da weiterhin folgendes: {"success":false,"data":[],"message":"[Semantical Error] line 0, col 1234 near 'futi\_shoe\_size': Error: Class Shopware\\Models\\Attribute\\OrderDetail has no association named futi\_shoe\_size"}

Also ich hab jetzt mal die QueryBuilder Funktion rausgesucht. Diese sieht wie folgt aus. /\*\* \* Adds an item that is to be returned in the query result. \* \* ` * $qb = $em->createQueryBuilder() * ->select('u') * ->addSelect('p') * ->from('User', 'u') * ->leftJoin('u.Phonenumbers', 'p'); * ` \* \* @param mixed $select The selection expression. \* @return QueryBuilder This QueryBuilder instance. \*/ public function addSelect($select = null) { $this-\>\_type = self::SELECT; if (empty($select)) { return $this; } $selects = is\_array($select) ? $select : func\_get\_args(); return $this-\>add('select', new Expr\Select($selects), true); } Meine Aktuelle Funktion sieht wie folgt aus // get original builder $builder = $arguments-\>getReturn(); $builder-\>select('od') -\>addSelect('futi\_shoeSize') -\>from('Shopware\Models\Attribute\OrderDetail', 'od') -\>leftJoin('od.futi\_shoeSize', 'futi\_shoeSize'); $arguments-\>setReturn($builder); Ich habe mein addAttribute jetzt noch auf folgendes geändert $this-\>Application()-\>Models()-\>addAttribute( 's\_order\_details\_attributes', 'futi', 'shoeSize', 'int(11)', true, null ); Resultat ist folgende Message {"success":false,"data":[],"message":"[Semantical Error] line 0, col 935 near 'futi\_shoeSize': Error: Class Shopware\\Models\\Attribute\\OrderDetail has no association named futi\_shoeSize"} pls help @ :shopware:

Hallo, hast du nach dem Hinzufügen des Attributs den Cache geleert? $metaDataCacheDoctrine = Shopware()->Models()->getConfiguration()->getMetadataCacheImpl(); $metaDataCacheDoctrine->deleteAll(); Shopware()->Models()->generateAttributeModels(array(‘s_order_details_attributes’)); Danach müsstest du mit “futiShoeSize” auf das Feld zugreifen können.

Mein aktueller Code sieht wie folgt aus: private function createAttributes() { $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); $this-\>Application()-\>Models()-\>addAttribute( 's\_order\_details\_attributes', 'futi', 'shoeSize', 'int(11)', true, null ); $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); $this-\>getEntityManager()-\>generateAttributeModels(array( 's\_order\_details\_attributes' )); } Wenn ich in die Datei \engine\Shopware\Models\Attribute\OrderDetail.php schaue finde ich auch mein angelegtes Attribute Feld und die dazugehörigen Funktionen. /\*\* \* @var integer $futiShoeSize \* \* @ORM\Column(name="futi\_shoeSize", type="integer", nullable=true) \*/ protected $futiShoeSize; public function getFutiShoeSize() { return $this-\>futiShoeSize; } public function setFutiShoeSize($futiShoeSize) { $this-\>futiShoeSize = $futiShoeSize; return $this; } Ich glaube bald mehr das ich den Builder falsch benutze.

Hi, an dem Query Builder brauchst du nichts zu ändern damit dein Attribute mit selektiert wird. Die Attribute aus s_order_details_attributes werden bereits mit selektiert. $builder-\>from('Shopware\Models\Order\Order', 'orders'); $builder-\>leftJoin('orders.details', 'details') ... -\>leftJoin('details.attribute', 'detailAttribute') ....; Hier werden immer alle Daten aus den Models selektiert: $builder-\>select(array( 'orders', 'details', ... 'attribute', 'detailAttribute', .... ); Gruß Oliver

Ok aber wie rufe ich da nun den Wert ab? Mein aktueller Versuch sieht wie folgt aus view/detail/position.js //{block name="backend/order/view/detail/position" append} Ext.override(Shopware.apps.Order.view.detail.Position, { getColumns: function() { var me = this; var columns = me.callOverridden(arguments); var columnSize= { header: '{s name=preferences/shoe\_size}Shoe size{/s}', dataIndex:'futiShoeSize', flex: 1 }; return Ext.Array.insert(columns, 8, [columnSize]); } }); //{/block} Dieser Block funktioniert soweit auch. Nur das er mir überall den Wert 0 definiert. In der Datenbank sind aber andere Werte definiert. Ich habe noch die model/position.js //{block name="backend/order/model/position/fields" append} { name: 'futiShoeSize', type: 'int' }, //{/block} Danke im Voraus :slight_smile:

Hallo, Auch wenn der Beitrag etwas älter ist, aber Ich hatte gerade eben auch das Problem… Ursachen Lösung war Groß/Kleinschreibung beachten. Der genannte Snippet funktioniert jedenfalls :wink: