Der Propel-Generator erzeugt für jede Tabelle (beispielsweise
author) unter anderem eine abstrakte Basisklasse
(BaseAuthor), die sich von der abstrakten Klasse
BaseObject der Propel-Laufzeitumgebung ableitet, sowie eine
leere, aber konkrete Kindklasse (Author) hiervon.
Die abstrakte Klasse BaseAuthor aus unserem
Buchkatalog-Beispiel enthält Methoden wie getFirstName()
und setFirstName($v), um auf die Daten eines Autors
lesend und schreibend zugreifen zu können. In der konkreten Kindklasse
Author kann zusätzliche Logik implementiert werden.
Diese geht nicht verloren, wenn die PHP-Klassen neu aus der
XML-Spezifikation des Datenmodells erstellt werden.
Abbildung 12.5
zeigt ein UML-Klassendiagramm für die generierten Klassen
Author, Book und Publisher,
die wir im Folgenden verwenden wollen, um auf den Buchkatalog
zuzugreifen.
In Beispiel 12.4
initialisieren wir zunächst die Propel-Laufzeitumgebung durch Laden der
entsprechenden Klassen sowie der Konfigurationsdatei runtime-conf.php,
die aus runtime-conf.xml
(Beispiel 12.2) erzeugt wurde.
Im Anschluss erzeugen wir je ein Objekt der Klassen Author,
Book und Publisher und verwenden die
entsprechenden set-Methoden, um Vorname und Nachname des
Autors, Name des Verlags, ISBN und Titel des Buches zu setzen.
Der erste Aufruf der Methode save() auf dem
Book-Objekt führt dazu, dass je eine neue Zeile in die
Tabellen author, publisher und book
geschrieben wird. Der zweite Aufruf von save() fügt nur
jeweils eine neue Zeile in die Tabellen author und
book ein, da dasselbe Publisher-Objekt zuvor
verwendet (und somit derselbe Verlag referenziert) wird.
Beispiel 12.4: Ein neues Buch anlegen
<?php
require_once 'propel/Propel.php';
Propel::init('books/conf/runtime-conf.php');
require_once 'books/Author.php';
require_once 'books/Book.php';
require_once 'books/Publisher.php';
$sebastian = new Author;
$sebastian->setFirstName('Sebastian');
$sebastian->setLastName('Bergmann');
$dpunkt = new Publisher;
$dpunkt->setName('dpunkt.verlag');
$psmp5 = new Book;
$psmp5->setIsbn('3898642291');
$psmp5->setTitle(
'Professionelle Softwareentwicklung mit PHP 5'
);
$psmp5->setAuthor($sebastian);
$psmp5->setPublisher($dpunkt);
$psmp5->save();
$hakan = new Author;
$hakan->setFirstName('Hakan');
$hakan->setLastName('Kücükyilmaz');
$php5 = new Book;
$php5->setIsbn('3898642364');
$php5->setTitle('PHP 5');
$php5->setAuthor($hakan);
$php5->setPublisher($dpunkt);
$php5->save();
?>
Neben den Klassen Author, Book und
Publisher, deren Objekte jeweils einen Eintrag der
entsprechenden Tabelle repräsentieren, generiert der Propel-Generator
mit den Klassen AuthorPeer, BookPeer und
PublisherPeer Helferklassen mit statischen Methoden für
den Zugriff auf die Tabellen author, book
und publisher.
In Beispiel 12.5
nutzen wir die Methode retrieveByPK() der Klasse
AuthorPeer, um über den Primärschlüssel an eine Zeile
der Tabelle author zu gelangen. So können wir mit
setFirstName() den Vornamen des entsprechenden Autors
ändern und das Objekt im Anschluss über save(), das in
diesem Fall eine UPDATE-Anweisung ausführen wird, in
der Datenbank speichern.
Beispiel 12.5: Den Vornamen eines Autors ändern
<?php
require_once 'propel/Propel.php';
Propel::init('books/conf/runtime-conf.php');
require_once 'books/AuthorPeer.php';
// Autor mit Primärschlüssel 1 holen.
$author = AuthorPeer::retrieveByPK(1);
// Den Vornamen des Autors ändern.
$author->setFirstName('Johannes Sebastian');
// Die geänderten Daten speichern.
$author->save();
?>
Ein Eintrag einer Tabelle kann durch Aufrufen der Methode
delete() auf einem entsprechenden Objekt gelöscht
werden (Beispiel 12.6).
Beispiel 12.6: Ein Buch löschen
<?php
require_once 'propel/Propel.php';
Propel::init('books/conf/runtime-conf.php');
require_once 'books/BookPeer.php';
// Buch mit Primärschlüssel 1 holen.
$book = BookPeer::retrieveByPK(1);
// Das Buch löschen.
$book->delete();
?>