Objektmodell und Objektspeicher

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.

Abbildung 12.5. Die generierten Klassen Author, Book und Publisher

Die generierten Klassen Author, Book und Publisher


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.

Abbildung 12.6. Die generierten Klassen BaseAuthorPeer und AuthorPeer

Die generierten Klassen BaseAuthorPeer und AuthorPeer


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();
?>