La classe Criteria

Publié par Aline Bunelle Mer 12 déc 2007 16:43:00 GMT

La classe Criteria va nous permettre de formuler nos requêtes SQL.

Remarque : Un objet de type Criteria est attendu par les fonctions d’accès des classes Peer (doSelect; doDelete, ...).

Exemple:
    $c = new Criteria();
    $list = NomTablePeer::doSelect($c);
$list contiendra un tableau d’objets NomTable contenant TOUS les enregistrements de la table NomTable. Nous venons d’effectuer la requête :
    SELECT * FROM nom_table

Criteria et les conditions

Maintenant voyons comment ajouter des conditions à notre requête.

Pour cela, il suffit de les ajouter à notre objet. La méthode add de la classe Criteria prend trois paramètres, respectivement :
  • le champ affecté;
  • la valeur;
  • l’opérande.

Remarque : par défaut l’opérande est ’=’.

Exemple:
    $c = new Criteria();
    $c->add(NomTablePeer::ID, 5);
    $list = NomTablePeer::doSelect($c);

Nous récupérons l’enregistrement de la table nom_tablel’id est égale à 5. (Nous comprenons mieux la correspondance avec la méthode retrieveByPk vu tout à l’heure).

Ici nous allons recupérer aucun ou un enregistrement. En passant par la méthode doSelect, nous récupérerons soit :
  • un tableau vide,
  • un tableau d’une case.
Dans ce cas de figure utilisons la méthode doSelectOne où nous récupérerons soit:
  • une valeur VIDE,
  • directement notre objet NomTable.

La méthode add seule ne nous permettra pas d’effectuer des OR dans nos conditions de selection. Nous utiliserons pour cela les objets de type Criterion.

    $c = new Criteria();
    $criterion = $c->getNewCriterion (
              NomTable::ID, 6
            )->addOr(
                $c->getNewCriterion (
                      NomTable::ID, 8
                )
            );

    $c->addAnd($criterion);
Rien de bien compliqué, ici nous effectuons la requête :
    SELECT * FROM nom_table WHERE id = 6 OR id = 8

Criteria et les opérantes

Evidemment nous n’allons pas nous limiter à l’opérande ’=’, voici comment utiliser nos opérandes avec Criteria :
WHERE column = value         ->add(column, value);
WHERE column <> value         ->add(column, value, Criteria::NOT_EQUAL);
Other Comparison Operators     
> , <                 Criteria::GREATER_THAN, Criteria::LESS_THAN
>=, <=                 Criteria::GREATER_EQUAL, Criteria::LESS_EQUAL
IS NULL, IS NOT NULL         Criteria::ISNULL, Criteria::ISNOTNULL
LIKE, ILIKE             Criteria::LIKE, Criteria::ILIKE
IN, NOT IN                 Criteria::IN, Criteria::NOT_IN
Other SQL Keywords     
ORDER BY column ASC         ->addAscendingOrderByColumn(column);
ORDER BY column DESC         ->addDescendingOrderByColumn(column);
LIMIT limit             ->setLimit(limit)
OFFSET offset             ->setOffset(offset)
FROM table1, table2 WHERE table1.col1 = table2.col2     ->addJoin(col1, col2)
FROM table1 LEFT JOIN table2 ON table1.col1 = table2.col2     ->addJoin(col1, col2, Criteria::LEFT_JOIN)
FROM table1 RIGHT JOIN table2 ON table1.col1 = table2.col2 ->addJoin(col1, col2, Criteria::RIGHT_JOIN)

Le système Relationnel

Voyons enfin l’atout de notre système relationnel mis en place au début.

En indiquant nos clés étrangères, lors de la génération des objets, l’ORM va ajouter les méthodes permettant d’accèder, à partir d’un objet, à un autre objet lié. Plus clairement :

Au lieu de faire :
    $record = NomTablePeer::retrieveByPk(1);
    $c = new Criteria();
    $c->add(NomTable2Peer::NOM_TABLE_ID, 1);
    $record2 = NomTable2Peer::doSelectOne($c);
Nous allons effectuer:
    $record = NomTablePeer::retrieveByPk(1);
    $record2 = $record->getNomTable2();

Ceci nous fera gagner un temps et une clarté considérable dans notre application !

Publié sous  | Mots clés  | aucun commentaires

Comments

(leave url/email »)

   Aide sur le balisage des commentaires Prévisualiser le commentaire