Vale la pena descrivere una classe particolare chiamata Criteria (libsymfonypluginssfPropelPluginlibvendorpropelutil) che consente di costruire query complesse attraverso il metodo doSelect()
delle classi peer. Tale metodo accetta come parametro di ingresso un oggetto della classe Criteria che non è altro che la definizione della query.
Per descrivere meglio il funzionamento di questo metodo facciamo riferimento al Listato 15.
Listato 15: Utilizzo del metodo doSelect e della classe Criteria
per la costruzione di una query
$criteria = new Criteria();
$libri = LibroPeer::doSelect($criteria);
Il corrispondente SQL del Listato 15 è il seguente:
SELECT * FROM LIBRI
Nell'esempio appena illustrato vengono restituiti tutti i record della tabella LIBRI. Se vogliamo introdurre delle condizioni sarà necessario valorizzare l'oggetto $criteria
della classe Criteria.
Listato 16: Valorizzazione dell'oggetto $criteria della classe Criteria
per la costruzione di una query con condizioni
$criteria = new Criteria();
$criteria->add(LibroPeer::TITOLO, 'Guida Symfony');
$criteria->addAscendingOrderByColumn(LibroPeer::AUTORE);
$libri = LibroPeer::doSelect($criteria);
Nel Listato 17 troviamo il corrispondente SQL del Listato 16.
Listato 17: Corrispondente SQL del Listato 16
SELECT * FROM LIBRI WHERE TITOLO = 'Guida Symfony' ORDER BY AUTORE ASC
Nella tabella seguente vengono riportati i metodi della classe Criteria necessari per introdurre le condizioni nelle query.
SQL | Criteria |
---|---|
WHERE nomeColonna = valore | ->add(nomeColonna, valore); |
WHERE nomeColonna <> valore | ->add(nomeColonna, valore, Criteria::NOT_EQUAL); |
WHERE nomeColonna > valore | ->add(nomeColonna, valore, Criteria::GREATER_THEN); |
WHERE nomeColonna < valore | ->add(nomeColonna, valore, Criteria::LESS_THEN); |
WHERE nomeColonna >= valore | ->add(nomeColonna, valore, Criteria::GREATER_EQUAL); |
WHERE nomeColonna <= valore | ->add(nomeColonna, valore, Criteria::LESS_EQUAL); |
WHERE nomeColonna IS NULL | ->add(nomeColonna, Criteria::IS_NULL); |
WHERE nomeColonna IS NOT NULL | ->add(nomeColonna, Criteria::IS_NOT_NULL); |
WHERE nomeColonna LIKE valore | ->add(nomeColonna, valore, Criteria::LIKE); |
WHERE nomeColonna ILIKE valore | ->add(nomeColonna, valore, Criteria::ILIKE); |
WHERE nomeColonna IN valore | ->add(nomeColonna, valore, Criteria::IN); |
WHERE nomeColonna NOT IN valore | ->add(nomeColonna, valore, Criteria::NOT_IN); |
ORDER BY nomeColonna ASC | ->addAscendingOrderByColumn(nomeColonna); |
ORDER BY nomeColonna DESC | ->addDescendingOrderByColumn(nomeColonna); |
LIMIT valore | ->setLimit(valore); |
OFFSET valore | ->setOffset(valore); |
FROM tabella1, tabella2 WHERE tabella1.colonna1 = tabella2.colonna2 | ->addJoin(colonna1, colonna2) |
FROM tabella1 LEFT JOIN tabella2 ON tabella1.colonna1 = tabella2.colonna2 | ->addJoin(colonna1, colonna2, Criteria::LEFT_JOIN) |
FROM tabella1 RIGHT JOIN tabella2 ON tabella1.colonna1 = tabella2.colonna2 | ->addJoin(colonna1, colonna2, Criteria::RIGHT_JOIN) |
L'esempio del Listato 18 mostra come costruire la query riportata nel Listato 19.
Listato 18: Esempio di query
$criteria = new Criteria();
$criteria->addJoin(LibroPeer::TIPOLOGIE_ID, TipoLibro::ID);
$criteria->add(LibroPeer::AUTORE, '%Rossi%', Criteria::LIKE);
$criteria->add(TipoLibro::DESCRIZIONE, 'Informatica');
$criteria->addAscendingOrderByColumn(LibroPeer::AUTORE);
$criteria->addDescendingOrderByColumn(LibroPeer::AUTORE);
$libri = LibroPeer::doSelect($criteria);
Listato 19: Corrispondente SQL del Listato 18
SELECT
*
FROM
LIBRI,
TIPOLOGIE
WHERE
LIBRI.TIPOLOGIE_ID = TIPOLOGIE.ID
AND LIBRI.AUTORE LIKE '%Rossi%'
AND TIPOLOGIE.DESCRIZIONE = 'Informatica'
ORDER BY
LIBRI.AUTORE ASC,
LIBRI.EDITORE DESC