2. Was Propel Ist
PDO
PDO
MySQL
MySQL
• ORM für PHP 5
PostgreSQL
PostgreSQL
SQLite
SQLite
MSSQL
MSSQL
Oracle
Oracle
• 2005 gestartet
• basiert auf Konzepten Apache Torque
• Aufteilung in Generator und Runtime
• Schema
• MIT-Lizenz
8. Class Table
Inheritance
• Struktur analog zu Vererbung in Klassen
• Realisierung via Delegation
• ermöglicht „Mehrfachvererbung“
<?php
$basketballer = new Basketballer();
$basketballer->setPoints(101);
$basketballer->setFieldGoals(47);
$basketballer->setThreePointsFieldGoals(7);
// set player identity via delegation
$basketballer->setFirstName('Michael');
$basketballer->setLastName('Giordano');
// same as
$player = new Player();
$player->setFirstName('Michael');
$player->setLastName('Giordano');
$basketballer->setPlayer($player);
// save basketballer and player
$basketballer->save();
// retrieve delegated data directly from the main object
echo $basketballer->getFirstName(); // Michael
10. Concrete Table
Inheritance
• hält gemeinsame Informationen doppelt vor
• übernimmt Fremdschlüssel, Indexes und Validatoren
• stellt via Transaktion Integrität zwischen Super- und Subclass sicher
<?php
// create a new Category
$cat = new Category();
$cat->setName('Movie');
$cat->save();
// create a new Article
$art = new Article();
$art->setTitle('Avatar Makes Best Opening Weekend in the History');
$art->setCategory($cat);
$art->setContent('With $232.2 million worldwide total, Avatar had one of the
best-opening weekends in the history of cinema.');
$art->save();
// create a new Video
$vid = new Video();
$vid->setTitle('Avatar Trailer');
$vid->setCategory($cat);
$vid->setResourceLink('http://www.avatarmovie.com/index.html')
$vid->save();
11. Concrete Table
Inheritance
• OO Arbeiten mit den Modellen
• Denormalisierung für optimale Performance
• Propel kümmert sich um das Mapping
• PHP arbeitet…
• …mit der Vererbungshirachie
• …auf den Objekten, nicht auf Datensätzen
• …auf Collections, nicht auf Arrays
• …auf Beziehungen, nicht auf Fremdschlüsseln
15. BaseClass
• Validation Properties (getter/setter)
/**
* Sets the value of [created_at] column to a normalized version of the date/time value specified.
*
* @param mixed $v string, integer (timestamp), or DateTime value.
* Empty strings are treated as null.
* @return Category The current object (for fluent API support)
*/
public function setCreatedAt($v)
{
$dt = PropelDateTime::newInstance($v, null, 'DateTime');
if ($this->created_at !== null || $dt !== null) {
$currentDateAsString = ($this->created_at !== null && $tmpDt = new DateTime($this->created_at)) ? $tmpDt->format('Y-m-d H:i:s') :
null;
$newDateAsString = $dt ? $dt->format('Y-m-d H:i:s') : null;
if ($currentDateAsString !== $newDateAsString) {
$this->created_at = $newDateAsString;
$this->modifiedColumns[] = CategoryPeer::CREATED_AT;
}
} // if either are not null
return $this;
} // setCreatedAt()
16. Class
• Klasse wird tatsächlich verwendet
• überschreibt standardmäßig leer die Basis
• custom Getter/Setter
• Raum für DB-ferne, zusätzliche Funktionen
17. Class
$category = new Category(); $con = Propel::getConnection();
$category->setName('Propel');
$con->beginTransaction();
$article = new Article();
$article try {
->setTitle('Propel is Awesome') $category = new Category();
->setBody('You know why') $category->setName('Propel');
->setCategory($category)
->save(); $article = new Article();
$article
->setTitle('Propel is Awesome')
->setBody('You know why')
->setCategory($category)
->save($con);
$another_article = new Article();
$another_article
->setTitle('Doctrine not so much')
->setBody('You know why')
->setCategory($category)
->save($con);
$con->commit();
}
catch (Exception $e) {
$con->rollBack();
}
18. ModelCriteria
• Vererbungsbaum der Query-Klassen
• ModelCriteria > BaseClassQuery > ClassQuery
• ModelCriteria implementiert eine abstrakte,
formale Definition einer SQL-Datenbankabfrage
• kann überführt werden in konkrete Abfragen
für MySQL, MSSQL, etc
19. BaseClassQuery
• BaseClassQuery implementiert…
• …fluent API für ModelCriteria
• einfaches Filtern – filterByXXX()
• einfaches Abfragen – findByXXX()
• paginate, delete, update, …
• …Class spezifische Methoden (für joins, etc)
• …@method-Definitionen für IDEs für MagicMethods
20. ClassQuery
• Klasse wird tatsächlich verwendet
• überschreibt standardmäßig leer die Basis
• Ort für eigene filterBy Methoden