Nach Objekten im Objektspeicher suchen

Bislang konnten wir auf Objekte in der Datenbank nur über den Primärschlüssel und die Methode retrieveByPK() der entsprechenden Helferklasse zugreifen. Wenn wir nach einem Objekt suchen, so wird es in der Regel jedoch der Fall sein, dass wir den Primärschlüssel nicht kennen. Hier kommen die Klasse Criteria sowie die Methode doSelect() der Helferklassen ins Spiel.

Abbildung 12.7. Die Klasse PropelCriteria

Die Klasse PropelCriteria


Die Klasse Criteria kapselt eine beliebige Anzahl von Kriterien, nach denen mit der Methode doSelect() gesucht werden kann. In Beispiel 12.7 erzeugen wir zunächst ein Criteria-Objekt. Mit dem ersten Aufruf der Methode add() legen wir fest, dass der Vorname des Autors "Sebastian" sein soll. Die Konstante AuthorPeer::FIRST_NAME enthält hierbei den Namen der entsprechenden Tabellenspalte, auf die das Suchkriterium angewendet werden soll.

Beim zweiten Aufruf von add() nutzen wir den optionalen dritten Parameter der Methode, um den zu verwendenden Vergleichsoperator festzulegen: Criteria::NOT_EQUAL bedeutet in diesem Fall, dass der Nachname nicht "Nohn" sein soll. Die verfügbaren Vergleichsoperatoren sind die Konstanten der Klasse Criteria in Abbildung 12.7.

Schließlich wird das Criteria-Objekt an die Methode AuthorPeer::doSelect() übergeben, die ein Array der passenden Author-Objekte als Ergebnis liefert.

Beispiel 12.7: Suche nach Objekten mit einfachen Kriterien

<?php
require_once 'propel/Propel.php';
Propel::init('books/conf/runtime-conf.php');
 
require_once 'books/AuthorPeer.php';
 
$criteria = new Criteria;
 
$criteria->add(
  AuthorPeer::FIRST_NAME,
  'Sebastian'
);
 
$criteria->add(
  AuthorPeer::LAST_NAME,
  'Nohn',
  Criteria::NOT_EQUAL
);
 
$authors = AuthorPeer::doSelect($criteria);
 
foreach ($authors as $author) {
    print 'Sebastian ' . $author->getLastName();
}
?>
Sebastian Bergmann


Intern führt die Ausführung der Methode add() des Criteria-Objektes dazu, dass ein neues Objekt der Klasse Criterion erzeugt und dem Criteria-Objekt hinzugefügt wird. Alternativ kann man ein solches Criterion-Objekt auch von Hand erzeugen und ebenfalls über die Methode add() einem Criteria-Objekt hinzufügen.

Möchte man Suchkriterien miteinander kombinieren, beispielsweise mit einer Oder-Verknüpfung, so muss man zunächst entsprechende Criterion-Objekte über die Methode getNewCriterion() eines Criteria-Objektes erzeugen. Über die Methode addOr() vollzieht man dann die Oder-Verknüpfung der beiden Suchkriterien und fügt diese dann dem Criteria-Objekt hinzu. So wird in Beispiel 12.8 nach Autoren gesucht, deren Vorname "Sebastian" oder "Hakan" ist.

Beispiel 12.8: Suche nach Objekten mit verknüpften Kriterien

<?php
require_once 'propel/Propel.php';
Propel::init('books/conf/runtime-conf.php');
 
require_once 'books/AuthorPeer.php';
 
$criteria  = new Criteria;
 
$sebastian = $criteria->getNewCriterion(
  AuthorPeer::FIRST_NAME,
  'Sebastian'
);
 
$hakan = $criteria->getNewCriterion(
  AuthorPeer::FIRST_NAME,
  'Hakan'
);
 
$sebastian->addOr($hakan);
$criteria->add($sebastian);
 
$authors = AuthorPeer::doSelect($criteria);
 
foreach ($authors as $author) {
    print $author->getFirstName() . $author->getLastName();
}
?>
Sebastian Bergmann
Hakan Kücükyilmaz