Dieser Artikel ist bereits über 2 Jahre alt. Das gezeigte Vorgehen ist vielleicht nicht mehr aktuell.
Copyright bei Patrick Froch und easy Solutions IT. Dieses Werk ist lizenziert unter Creative Commons BY-NC-SA.
Konfiguration
Als erstes müssen die Zugangsdaten für die Datenbank eingegeben werden. Dies kann in der Dateiapp/config/parameters.yml
geschehen:
Nun kann man sich die Datenbank von Doctrine erstellen lassen (muss man aber nicht, man kann sie auch von Hand oder
anderen Tools anlegen lassen):
Es ist darauf zu achten, dass als Vorgabewert für die Zeichenkodierung des MySQL-Servers UTF-8 eingestellt ist!
Entity
Als nächstes muss eine Klasse erstellt werden, die eine Tabelle der Datenbank repräsentiert. Sie wird Eigenschaften für die einzelnen Felder enthalten, sowie die Metadaten für die Erstellunge und Zuordnung der Eigenschaften zu den einzelnen Spalten der Tabelle in der DB. Ich werde hier die Metadaten als Annotations angeben. Die Infos über die anderen Möglichkeiten findet man im Symfony-Handbuch .
Die Metadate in einem Bundle können immer nur auf eine Art angegeben werden, ein Mischen der verschiedenen
Möglichkeiten (z.B. YAML und Annotations ) ist nicht möglich!
Damit Doctrine weiß, dass diese Klasse relevant ist, muss im Kommentar über der Klasse festgelegt werden, dass es sich
um ein Entity handelt (Zeile 8) @ORM\Entity
. In Zeile 9 wird der Name der Tabelle
festgelegt. Ab Zeile 13 kommen die einzelnen Felder der Tabelle. Es werden verschiedene Einstellungen vorgenommen. In
Zeile 14 - 16 wird die id
als PRIMARY KEY
festgelegt. Bei den anderen Spalten wird jeweils der Typ und evtl. nötige Einstellungen wie Länge oder Kommastellen
angegeben. Eine Übersicht der Feldtypen gibt es
hier
.
Wird der Name der Tabelle nicht angegeben, wird der Name der Klasse verwendet!
Damit die Eingenschaften gesetzt und abgerufen werden können, müssen Getter- und Setter-Methoden erstellt werden.
Hierbei greift einem Symfony etwas unter die Arme, so dass man nicht alles manuell machen muss.
Nun werden die entsprechenden Methoden erstellt und die erste Klasse ist fertig. Es muss nur noch die Tabelle mit den
Feldern erstellt werden. Dies geschieht ebenfalls über die Symfony-Konsole:
Erstellen der Daten
Nach dem nun die Klasse angelegt und die Tabelle erzeugt ist, kann man die ersten Daten eingeben. Will man die eben erstellte Klasse z.B. im Controller verwenden, geht man wie folgt vor: In Zeile 10 wird eine Instanz der Klasse erzeugt und in den Zeilen 11 - 13 mit Daten befüllt. In Zeile 15 wird derEntityManager
geladen. Dieser kümmert sich um das Speichern der Daten. Hierzu
wird ihm in Zeile 16 das Objekt übergeben. Diese Aktion dient allerdings noch nicht dem Speichern, es wird Doctrine
nur bekannt gegeben, dass es sich ab jetzt um dieses Objekt kümmern soll. Das eigentliche Speichern geschieht in
Zeile 17. Dieses Vorgehen hat Vorteile, bei der Verarbeitung größerer Datenmengen. Man kann Doctrine die einzelnen
Objekte übergeben (z.B. in einer Schleife) und erst ganz am Ende die flush
-Methode
aufrufen. Ob es sich bei einem flush
um ein INSERT
oder ein UPDATE
handelt, entscheidet Doctrine selber und natürlich
können diese auch gemischt vorkommen. Doctrine ist intelligent genug, um dies für jedes Element herauszufinden und den
effizientesten Weg zum Speichern der Daten zu ermitteln.
Auslesen der Daten
Will man nun die Daten aus der Datenbank auslesen, ist dies genau so einfach: In Zeile 4 und 5 wird über Doctrine das Repository für die Entity geladen. In Zeile 6 wird mit derfind
-Methode und der Id die Klasse mit den Daten geladen. In Zeile 8 wird geprüft, ob
ein Objekt erstellt wurde, ist dies nicht der Fall (z.B. weil keine entsprechenden Daten gefunden wurden) wird ein
Fehler erzeugt.
Dieses Vorgehen setzt natürlich voraus, dass die Id bekannt ist, häufig ist aber gerade dies nicht der Fall. Man kann
dann mit den findBy
-Methoden die Daten suchen. Diese Methoden gibt es für jedes Feld.
(Natürlich wird nicht für jedes Feld eine solche Methode angelegt, es handelt sich um eine
magische Methode
.) Will man also z.B. ein Produkt mit einem bestimmten Namen finden, nutzt man die Methode
findByName()
.
Nun kam man mit dem Objekt ($product
) weiter arbeiten. Will man mehrere Bedingungen
angeben, nutzt man ein Array:
Natürlich kann man sich auch alle Daten geben lassen:
Daten ändern
Nun haben wir bereits alles, um die Daten ändern zu können. Als erstes wird auf eine der oben gezeigten Arten ein Objekt aus der DB geladen. Dann werden die neuen Daten zugewiesen und das Objekt wird gespeichert. Zusammen sieht dies dann z.B. so aus:Daten löschen
Für das Löschen benötigen wir eine neue Methode, nämlich dieremove
-Methode des
EntityManager
. Dieser Methode wird das zu löschenden Objekt übergeben.
Es wird also erst wie gewohnt ein Objekt mit den Daten aus der DB geladen und dann an den
EntityManager
zum Löschen übergeben:
Dies soll als kleine Einführung reichen. Für weitere Informationen stehen die Handbücher von
Symfony
und
Doctrine
bereit.
Kommentare
Einen Kommentar schreiben