giovedì 17 dicembre 2009

symfony, metodi 'magici' find di Doctrine

Doctrine offre la possibilità di interrogare una tabella del database attraverso metodi speciali definiti 'magic finders'. Vediamo alcuni esempi che utilizzano il database di Lyra. Ad esempio per interrogare la tabella articles (classe LyraArticle) per prima cosa si ottiene un'istanza della classe Doctrine_Table

$dt = Doctrine::getTable('LyraArticle');

Il caso più semplice è la ricerca di un record attraverso la chiave primaria

$article = $dt->find(1);

$article contiene il record con chiave primaria (nel nostro caso il campo ID di articles) uguale a 1. Per effettuare una ricerca su un campo diverso dalla chiave primaria si utilizza la variante findBynomecampo

$articles = $dt->findByIsActive(true);

$articles contiene l'insieme degli articoli pubblicati (campo is_active è true). Da notare che quando, come in questo caso, il nome del campo è composto da più parole separate dal carattere sottolineato, il nome del metodo si crea utilizzando il camel case (campo: is_active, metodo: findByIsActive()).

Si può effettuare una ricerca su più campi, ad esempio per ottenere tutti gli articoli pubblicati (is_active true) ed impostati per apparire in prima pagina (is_featured true)

$articles = $dt->findByIsActiveAndIsFeatured(true, true);

Oltre ad AND si può utilizzare anche OR.

I metodi findBy restituiscono un insieme di record (Doctrine_Collection), quando si preferisce che venga restituito un singolo oggetto record (Doctrine_Record) si deve utilizzare findOneBynomecampo, ad esempio

$article = $dt->findOneByTitle('Titolo articolo');

Anche se esistesse più di un articolo con titolo 'Titolo articolo' solo il primo record sarebbe restituito in $article.

Abbiamo anche la possibilità di ottenere array invece che oggetti come valore di ritorno da ogni metodo 'magic finder'. In base alla scelta cambia naturalmente il modo di accedere ai valori dei campi. Ad esempio

$articles = Doctrine::getTable('LyraArticle')
  ->FindByIsActive(true);

$articles è una collezione di oggetti, quindi i valori dei campi si ottengono come proprietà dell'oggetto record.

foreach($articles as $a) {
  echo $a->title;
}

Alternativamente

$articles = Doctrine::getTable('LyraArticle')
      ->FindByIsActive(true, Doctrine::HYDRATE_ARRAY);

$articles è un array ed i valori dei singoli campi si ottengono tramite indice.

foreach($articles as $a) {
  echo $a['title'];
}

2 commenti:

Luigi Massa (lmassa@opsource.it) ha detto...

Ottimo,
stavo studiando il manuale di Doctrine ma non avevo ancora capito bene i magic finder.
Grazie mille, ottimo lavoro

Massimo ha detto...

Di nulla :) sono contento che ti sia stato utile.

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.