SlideShare a Scribd company logo
Klaus Großmann
   Dshini UG
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
Generator
<?xml version="1.0" encoding="UTF-8"?>
<database name="bookstore" defaultIdMethod="native">
    <table name="book" phpName="Book">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="title" type="varchar" size="255" required="true" />
        <column name="isbn" type="varchar" size="24" required="true" phpName="ISBN"/>
        <column name="publisher_id" type="integer" required="true"/>
        <column name="author_id" type="integer" required="true"/>
        <foreign-key foreignTable="publisher" phpName="Publisher" refPhpName="Book">
             <reference local="publisher_id" foreign="id"/>
        </foreign-key>
        <foreign-key foreignTable="author">
             <reference local="author_id" foreign="id"/>
        </foreign-key>
    </table>
    <table name="author" phpName="Author">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="first_name" type="varchar" size="128" required="true"/>
        <column name="last_name" type="varchar" size="128" required="true"/>
    </table>
    <table name="publisher" phpName="Publisher">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
        <column name="name" type="varchar" size="128" required="true" />
    </table>
</database>
Generator

• Code-Generation aus XML-Schema
 • schnell
 • IDE freundlich
 • leicht zu lernen und verstehen
Killerfeatures

• Inheritance
 • Single Table Inheritance
 • Class Table Inheritance
 • Concrete Table Inheritance
Single Table
                                Inheritance
• semantische Unterscheidung von Objekten
  <table name="book" abstract="true">
      <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true"/>
      <column name="title" type="VARCHAR" size="100"/>
      <column name="class_key" type="INTEGER" inheritance="single">
          <inheritance key="1" class="Book"/>
          <inheritance key="2" class="Essay" extends="Book"/>
          <inheritance key="3" class="Comic" extends="Book"/>
      </column>
  </table>

  <?php

  $book = new Book();
  $book->setTitle('War And Peace');
  $book->save();

  $essay = new Essay();
  $essay->setTitle('On the Duty of Civil Disobedience');
  $essay->save();

  $comic = new Comic();
  $comic->setTitle('Little Nemo In Slumberland');
  $comic->save();
Class Table
                                        Inheritance
<table name="player">
    <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" />
    <column name="first_name" type="VARCHAR" size="100" />
    <column name="last_name" type="VARCHAR" size="100" />
</table>
<table name="footballer">
    <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
    <column name="goals_scored" type="INTEGER" />
    <column name="fouls_committed" type="INTEGER" />
    <column name="player_id" type="INTEGER" />
    <foreign-key foreignTable="player">
        <reference local="player_id" foreign="id" />
    </foreign-key>
    <behavior name="delegate">
        <parameter name="to" value="player" />
    </behavior>
</table>
<table name="basketballer">
    <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
    <column name="points" type="INTEGER" />
    <column name="field_goals" type="INTEGER" />
    <column name="three_points_field_goals" type="INTEGER" />
    <column name="player_id" type="INTEGER" />
    <foreign-key foreignTable="player">
        <reference local="player_id" foreign="id" />
    </foreign-key>
    <behavior name="delegate">
        <parameter name="to" value="player" />
    </behavior>
</table>
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
Concrete Table
                                 Inheritance
<table name="content">
    <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" />
    <column name="title" type="VARCHAR" size="100" />
    <column name="category_id" required="false" type="INTEGER" />
    <foreign-key foreignTable="category" onDelete="cascade">
        <reference local="category_id" foreign="id" />
    </foreign-key>
</table>
<table name="category">
    <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" />
    <column name="name" type="VARCHAR" size="100" primaryString="true" />
</table>
<table name="article">
    <behavior name="concrete_inheritance">
        <parameter name="extends" value="content" />
    </behavior>
    <column name="body" type="VARCHAR" size="100" />
</table>
<table name="video">
    <behavior name="concrete_inheritance">
        <parameter name="extends" value="content" />
    </behavior>
    <column name="resource_link" type="VARCHAR" size="100" />
</table>
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();
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
Runtime

• nutzt generierte Klassen zur…
 • …Repräsentation (BaseObject)
 • …Datenabfrage (ModelCriteria)
• minimaler Gluecode
BaseObject

• Vererbungsbaum der ObjectModels
 • BaseObject > BaseClass > Class
• BaseObject implementiert
  Standardverhalten eines OM
BaseClass

• BaseClass implementiert transparent…
 • …DB-Abstraktion (save, delete, …)
 • …Validation Properties (getter/setter)
 • …Fremdschlüssel-Accessoren
 • …Behaviors
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()
Class

• Klasse wird tatsächlich verwendet
• überschreibt standardmäßig leer die Basis
• custom Getter/Setter
• Raum für DB-ferne, zusätzliche Funktionen
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();
                                      }
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
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
ClassQuery

• Klasse wird tatsächlich verwendet
• überschreibt standardmäßig leer die Basis
• Ort für eigene filterBy Methoden
ClassQuery

// Kurzform
ArticleQuery::create()->findOneByTitle('%Awesome', ArticleQuery::LIKE);
// Langform
ArticleQuery::create()
    ->filterByTitle('%Awesome', ArticleQuery::LIKE)
    ->findOne();
http://www.slideshare.net/francoisz/symfony2-meets-propel-15-4

More Related Content

PDF
Apache Solr Search Mastery
PDF
Your code sucks, let's fix it - DPC UnCon
PDF
Drupal - dbtng 25th Anniversary Edition
PDF
Your code sucks, let's fix it - PHP Master Series 2012
PDF
Dig Deeper into WordPress - WD Meetup Cairo
PPTX
Open Source Search: An Analysis
PDF
50 Laravel Tricks in 50 Minutes
PDF
Drupal & javascript
Apache Solr Search Mastery
Your code sucks, let's fix it - DPC UnCon
Drupal - dbtng 25th Anniversary Edition
Your code sucks, let's fix it - PHP Master Series 2012
Dig Deeper into WordPress - WD Meetup Cairo
Open Source Search: An Analysis
50 Laravel Tricks in 50 Minutes
Drupal & javascript

What's hot (20)

PDF
Your code sucks, let's fix it (CakeFest2012)
PPTX
HirshHorn theme: how I created it
KEY
jQuery: Tips, tricks and hints for better development and Performance
KEY
Introduction à CoffeeScript pour ParisRB
TXT
Daily notes
PDF
php plus mysql
TXT
My shell
DOC
PPTX
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
PDF
Separation of concerns - DPC12
PDF
Gail villanueva add muscle to your wordpress site
ZIP
Drupal Development (Part 2)
PPTX
Build your own entity with Drupal
PDF
Your Entity, Your Code
PDF
Learning jQuery made exciting in an interactive session by one of our team me...
PDF
Drupal is Stupid (But I Love It Anyway)
PPTX
Quality code by design
PPTX
Jquery-overview
PDF
The History of PHPersistence
PPTX
Let's write secure Drupal code! - Drupal Camp Poland 2019
Your code sucks, let's fix it (CakeFest2012)
HirshHorn theme: how I created it
jQuery: Tips, tricks and hints for better development and Performance
Introduction à CoffeeScript pour ParisRB
Daily notes
php plus mysql
My shell
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
Separation of concerns - DPC12
Gail villanueva add muscle to your wordpress site
Drupal Development (Part 2)
Build your own entity with Drupal
Your Entity, Your Code
Learning jQuery made exciting in an interactive session by one of our team me...
Drupal is Stupid (But I Love It Anyway)
Quality code by design
Jquery-overview
The History of PHPersistence
Let's write secure Drupal code! - Drupal Camp Poland 2019
Ad

Viewers also liked (20)

PDF
Divisio diferencies
DOCX
Cross Cultural Sensitivity
PPTX
Kirim email
PPS
Hands
PPTX
Présentation2
PPTX
Editing
PPTX
Herramienta outlook
PPTX
The importance of Historical Conscience for a creative return to the future (...
PPTX
Didactica enfoques psicopedagogicos
PPTX
ELOY ALFARO
PDF
Charles Perkins.
DOCX
Resume- Nishant Verma (JEE Consultant with 10+ years ) (1)
PDF
псалом 150 книжка раскраска для детей - Psalm 150 coloring book
PPTX
Enfoques, campos formativos y ámbitos
PDF
Psaumes 150 cahier de coloriage - Psalm 150 coloring book
PDF
PDF
Psalmen 150 malbuch für kinder - Psalm 150 coloring book
DOC
компютърна система Ibm
DOCX
Evaluation
DOCX
Pakistan NFC Horizontal Distribution
Divisio diferencies
Cross Cultural Sensitivity
Kirim email
Hands
Présentation2
Editing
Herramienta outlook
The importance of Historical Conscience for a creative return to the future (...
Didactica enfoques psicopedagogicos
ELOY ALFARO
Charles Perkins.
Resume- Nishant Verma (JEE Consultant with 10+ years ) (1)
псалом 150 книжка раскраска для детей - Psalm 150 coloring book
Enfoques, campos formativos y ámbitos
Psaumes 150 cahier de coloriage - Psalm 150 coloring book
Psalmen 150 malbuch für kinder - Psalm 150 coloring book
компютърна система Ibm
Evaluation
Pakistan NFC Horizontal Distribution
Ad

Similar to Propel sfugmd (20)

ODP
Php 102: Out with the Bad, In with the Good
PDF
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
PDF
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
PDF
laravel tricks in 50minutes
PDF
Desarrollo de módulos en Drupal e integración con dispositivos móviles
PDF
Contagion的Ruby/Rails投影片
 
PDF
Unit testing with zend framework tek11
PDF
You code sucks, let's fix it
KEY
Unit testing with zend framework PHPBenelux
KEY
Introducing CakeEntity
PDF
Your code sucks, let's fix it
ODP
Rich domain model with symfony 2.5 and doctrine 2.5
PDF
Your code sucks, let's fix it
PDF
Understanding backbonejs
PPTX
DrupalCamp Foz - Novas APIs Drupal 7
KEY
Introducing CakeEntity
PDF
Hooks WCSD12
PPTX
Taming that client side mess with Backbone.js
PDF
WordCamp Portland 2018: PHP for WordPress
PDF
jQuery - 10 Time-Savers You (Maybe) Don't Know
Php 102: Out with the Bad, In with the Good
Nickolay Shmalenuk.Render api eng.DrupalCamp Kyiv 2011
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
laravel tricks in 50minutes
Desarrollo de módulos en Drupal e integración con dispositivos móviles
Contagion的Ruby/Rails投影片
 
Unit testing with zend framework tek11
You code sucks, let's fix it
Unit testing with zend framework PHPBenelux
Introducing CakeEntity
Your code sucks, let's fix it
Rich domain model with symfony 2.5 and doctrine 2.5
Your code sucks, let's fix it
Understanding backbonejs
DrupalCamp Foz - Novas APIs Drupal 7
Introducing CakeEntity
Hooks WCSD12
Taming that client side mess with Backbone.js
WordCamp Portland 2018: PHP for WordPress
jQuery - 10 Time-Savers You (Maybe) Don't Know

Propel sfugmd

  • 1. Klaus Großmann Dshini UG
  • 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
  • 3. Generator <?xml version="1.0" encoding="UTF-8"?> <database name="bookstore" defaultIdMethod="native"> <table name="book" phpName="Book"> <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> <column name="title" type="varchar" size="255" required="true" /> <column name="isbn" type="varchar" size="24" required="true" phpName="ISBN"/> <column name="publisher_id" type="integer" required="true"/> <column name="author_id" type="integer" required="true"/> <foreign-key foreignTable="publisher" phpName="Publisher" refPhpName="Book"> <reference local="publisher_id" foreign="id"/> </foreign-key> <foreign-key foreignTable="author"> <reference local="author_id" foreign="id"/> </foreign-key> </table> <table name="author" phpName="Author"> <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/> <column name="first_name" type="varchar" size="128" required="true"/> <column name="last_name" type="varchar" size="128" required="true"/> </table> <table name="publisher" phpName="Publisher"> <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" /> <column name="name" type="varchar" size="128" required="true" /> </table> </database>
  • 4. Generator • Code-Generation aus XML-Schema • schnell • IDE freundlich • leicht zu lernen und verstehen
  • 5. Killerfeatures • Inheritance • Single Table Inheritance • Class Table Inheritance • Concrete Table Inheritance
  • 6. Single Table Inheritance • semantische Unterscheidung von Objekten <table name="book" abstract="true"> <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true"/> <column name="title" type="VARCHAR" size="100"/> <column name="class_key" type="INTEGER" inheritance="single"> <inheritance key="1" class="Book"/> <inheritance key="2" class="Essay" extends="Book"/> <inheritance key="3" class="Comic" extends="Book"/> </column> </table> <?php $book = new Book(); $book->setTitle('War And Peace'); $book->save(); $essay = new Essay(); $essay->setTitle('On the Duty of Civil Disobedience'); $essay->save(); $comic = new Comic(); $comic->setTitle('Little Nemo In Slumberland'); $comic->save();
  • 7. Class Table Inheritance <table name="player"> <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" /> <column name="first_name" type="VARCHAR" size="100" /> <column name="last_name" type="VARCHAR" size="100" /> </table> <table name="footballer"> <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" /> <column name="goals_scored" type="INTEGER" /> <column name="fouls_committed" type="INTEGER" /> <column name="player_id" type="INTEGER" /> <foreign-key foreignTable="player"> <reference local="player_id" foreign="id" /> </foreign-key> <behavior name="delegate"> <parameter name="to" value="player" /> </behavior> </table> <table name="basketballer"> <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" /> <column name="points" type="INTEGER" /> <column name="field_goals" type="INTEGER" /> <column name="three_points_field_goals" type="INTEGER" /> <column name="player_id" type="INTEGER" /> <foreign-key foreignTable="player"> <reference local="player_id" foreign="id" /> </foreign-key> <behavior name="delegate"> <parameter name="to" value="player" /> </behavior> </table>
  • 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
  • 9. Concrete Table Inheritance <table name="content"> <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" /> <column name="title" type="VARCHAR" size="100" /> <column name="category_id" required="false" type="INTEGER" /> <foreign-key foreignTable="category" onDelete="cascade"> <reference local="category_id" foreign="id" /> </foreign-key> </table> <table name="category"> <column name="id" required="true" primaryKey="true" autoIncrement="true" type="INTEGER" /> <column name="name" type="VARCHAR" size="100" primaryString="true" /> </table> <table name="article"> <behavior name="concrete_inheritance"> <parameter name="extends" value="content" /> </behavior> <column name="body" type="VARCHAR" size="100" /> </table> <table name="video"> <behavior name="concrete_inheritance"> <parameter name="extends" value="content" /> </behavior> <column name="resource_link" type="VARCHAR" size="100" /> </table>
  • 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
  • 12. Runtime • nutzt generierte Klassen zur… • …Repräsentation (BaseObject) • …Datenabfrage (ModelCriteria) • minimaler Gluecode
  • 13. BaseObject • Vererbungsbaum der ObjectModels • BaseObject > BaseClass > Class • BaseObject implementiert Standardverhalten eines OM
  • 14. BaseClass • BaseClass implementiert transparent… • …DB-Abstraktion (save, delete, …) • …Validation Properties (getter/setter) • …Fremdschlüssel-Accessoren • …Behaviors
  • 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
  • 21. ClassQuery // Kurzform ArticleQuery::create()->findOneByTitle('%Awesome', ArticleQuery::LIKE); // Langform ArticleQuery::create() ->filterByTitle('%Awesome', ArticleQuery::LIKE) ->findOne();