Shopware arbeitet mit Mysql als Datenbank. Hier kann man entweder auf einen normalen Mysql Server setzen oder MariaDB benutzen, welches ich in letzter Zeit definitiv bevorzuge (aus Performance Gründen). Shopware supported MariaDB offiziell nicht, aber was nicht ist, kann ja noch werden 😉
Verbindung zur Datenbank aufbauen
Es gibt zwei Wege um die Datenbankverbindung aufzubauen, ich gehe hier nur auf die neuste ein: DBAL-Connection
Das alte Shopware-DB lassen wir weg, da es vermutlich bald aus allen Shopware Core Funktionen verschwindet, in denen es aktuell noch teilweise Bestand hat.
$connection = Shopware()->Container()->get('dbal_connection');
Ist der typische Weg die DBAL-Connection aufzubauen – wie üblich gehen wir dabei über den Shopware Container.
Nun können wir unsere Queries definieren:
$query1 = 'SELECT * FROM s_articles WHERE id = 1';
und ausführen:
$result = $connection->query($query1)->fetch();
Der Querybuilder
Ich bevorzuge selbst für kleiner Queries den Doctrine Querybuilder, da er wesentlich übersichtlicher ist und schnell aufzeigt was gemacht wird.
$querybuilder = $connection->createQuerybuilder(); $address = $querybuilder->select(['address.*']) ->from(s_order_billingaddress, 'address') ->join('address', 's_order', '', 'address.orderID = s_order.id AND s_order.ordernumber = :orderNumber') ->setParameter('orderNumber', $orderNumber) ->execute() ->fetch();
So sieht man auf den ersten Blick um was es geht.
ORM
Der „Object Relational Mapper“ kurz ORM von Doctrine ist in Shopware ein weiterer wichtiger Bestandteil um Daten aus Mysql in objektorientierter Weise abzubilden. Die Models in engine/Shopware/Models lassen sich mit Hilfe von Annotation im Kommentar Bereich spezifizieren.
Beispielsweise in engine/Shopware/Models/Blog/Blog.php
/** * INVERSE SIDE * * @ORM\OneToMany(targetEntity="Shopware\Models\Blog\Comment", mappedBy="blog", orphanRemoval=true, cascade={"persist"}) * * @var \Doctrine\Common\Collections\ArrayCollection An array of \Shopware\Models\Blog\Comment Objects */ protected $comments;
Um diese Models im Plugin zu erhalten nutzen wir den Model/Entitymanager:
/** @var \Shopware\Components\Model\ModelManager $entityManager */ $entityManger = $this->container->get('models'); $blogRepo = $entityManger->getRepository(\Shopware\Models\Blog\Blog_::class); /** @var \Shopware\Models\Blog\Blog $blogentry */ $blogentry = $blogRepo->findOneBy(['title' => 'Auf die Piste']);
Ich empfehle euch beim nutzen der Models über den Orm das Shopwareplugin in PHPStorm zu nutzen – so bekommt Ihr direkt alle Vorschläge angezeigt:
Das ganze vereinfacht uns die Nutzung des Doctrine ORM sehr. Wie im Bild zu sehen, greife ich direkt auf einen Getter des Blog Models zu (getCategoryId) – so brauche ich nicht das ganze Objekt zu holen und mir den Wert dort herausziehen.
Die jeweiligen Getter und Setter finde ich in /engine/Shopware/Models/Blog/Blog.php oder werden einfach via Plugin direkt in das Dropdown geladen.
Man kann damit auch Assoziationen auf andere Models herstellen – zum Beispiel den ersten Namen eines Tags auslesen:
/** @var \Shopware\Models\Blog\Blog $blogentry */ $blogentry = $blogRepo->findOneBy(['title' => 'Auf die Piste'])->getTags()->first()->getName();
Der Getter getTags() stellt die Verbindung zu Tags her, first() bestimmt dass das erste Ergebnis gewählt wird und mit getName() holen wir den Namen des Tags. Performant ist das ganze nicht wirklich – aber dafür bekommt man schnell das passende Ergebnis und kann sich danach um die Performance kümmern.
ORM – Daten einfügen
Im folgenden Beispiel setze ich vorab ein
use \Shopware\Models\Customer\Customer;
zu Beginn meiner Plugin File, da ich die Customer Klasse/Model noch öfter nutzen möchte.
Mit $new_customer = new Customer; erstelle ich ein neues Kundenobjekt, welches ich danach befülle:
$new_customer->setFirstname('Micha'); $new_customer->setLastname('Hobert'); $new_customer->setPassword('123456'); $new_customer->setEmail('micha@shopware.de'); $new_customer->setActive(TRUE); $entityManger->persist($new_customer); $entityManger->flush($new_customer);
Damit haben wir einen neuen Kunden erstellt.
ORM – Daten updaten
Am Beispiel des Blogs könnten wir auch einfach den Titel des Beitrages „Auf die Piste“ ändern:
$blog_entry = $blogRepo->findOneBy(['title' => 'Auf die Piste']); if($blog_entry){ $blog_entry->setTitle('Anderer Titel'); $entityManger->flush(); }
ORM – Daten löschen
Oder den Beitrag direkt löschen:
$blog_entry = $blogRepo->findOneBy(['title' => 'Anderer Titel']); if($blog_entry){ $entityManger->remove($blog_entry); $entityManger->flush(); }