La nostra classe eredita dalla classe padre il metodo statico model. Questo metodo restituisce una istanza di active record che ci consente di accedere ai metodi della classe stessa. Detto questo diciamo che sfruttando questo metodo, esistono diversi sistemi per poter recuperare una riga della nostra tabella.
Ricerca una riga nella tabella in base a delle condizioni
$usr = User::model()->findByPk($id,$condizione, $parametri);
Effettua la ricerca in base alla chiave primaria e altre condizioni
$usr = User::model()->findByAttributes($attribute,$condizione, $parametri);
Effettua una ricerca su uno specifico campo e su una determinata condizione
$usr = User::model()->findBySql($sql,$parametri);
Effettua una ricerca a partire da una query sql
$usr = User::model()->findBySql($sql,$parametri);
Tutti i metodi restituiscono, se la trovano, una riga della tabella. Questo significa che se la query ha un riscontro nella variabile $usr
, avremo un'istanza dell'active record dove le varie proprietà, che rappresentano i campi della tabella, sono valorizzati con i dati estratti dalla tabella.
Nei metodi sopra vengono passati le variabili $sql
, $condizione
e $parametri
.
$condizione
rappresenta appunto la condizione della query. In pratica corrisponde al where di una normale query sul database. La forma più comune è:campo=:parametrocampo
, in questo caso quindi
$parametri = array(':parametrocampo'=>'valore');
$sql
corrisponde ad una normale query sql in cui, magari, sono definiti dei parametri sempre nel formato:nomeparametro
.
Ai metodi sopra è possibile passare anche un'istanza della classe CDbCriteria
. Come suggerisce il nome questa classe fornisce i criteri per interrogare il database. La sintassi è abbastanza semplice. Mediante questa classe è possibile costruire la query passo per passo.
$criteria = new CDbCriteria();
$criteria->select = "nome";
$criteria->condition = "user=:user";
$criteria->params = array(":user"=>"ciro");
E quindi
$usr = User::model()->find($criteria);
La classe CDbCriteria
è molto più utile quando si devono realizzare query più complesse di quella rappresentata nell'esempio.
Giusto per completezza di informazioni è possibile passare i criteri come un unico array chiave valore. La chiavi corrispondono alle proprietà della classe CDbCriteria, quindi:
$usr = User::model()->find(
array(
'select'=>'nome',
'condition'=>'user=:user',
'params'=> array(":user"=>"ciro"),
)
);
Per individuare più record ci vengono in soccorso i seguenti metodi.
$usr = User::model()->findAll($condition,$params);
$usr = User::model()->findAllByPk($id,$condition,$params);
$usr = User::model()->findAllByAttributes($attributes,$condition,$params);
$usr = User::model()->findAllBySql($sql,$params);
Come si può verificare i metodi sono, fatta eccezione per il nome che comprende la parola All, identici a quelli descritti precedentemente.
Tornando all'aggiornamento dei dati, e quindi all'operazione di update, abbiamo già visto che è possibile effettuarla con il metodo save dopo aver invocato uno dei metodi per recuperare un record del database. È possibile utilizzare anche i seguenti metodi per effettuare l'operazione di update:
User::model()->updateAll($attributes,$conditions,$params);
User::model()->updateByPk($id,$attributes,$conditions,$params);
Come si intuisce, il primo metodo consente di modificare tutte le righe di una tabella in base ad una specifica condizione e i relative parametri. $attributes
è un array costituito dai valori delle colonne. Il secondo metodo consente di effettuare l'update di una singola riga in base al valore della chiave primaria $id
. I metodi indicati non effettuano la validazione sui dati.
Per completare l'insieme dei metodi che ci consentono di effettuare le operazioni CRUD sul nostro database, non ci resta che verificare in che modo Yii cancelli i dati dal nostro database.
Il metodo più semplice è quello di caricare il record in un model e, successivamente, invocare il metodo delete.
$usr = User::model()->findByPk($id);
$usr->delete();
Anche in questo caso non è affatto necessario recuperare il record prima di eliminarlo.
Infatti il metodo
User::model()->deleteByPk($id,$conditions,$params);
è del tutto equivalente al precedente.
Prima di concludere la nostra panoramica sulle operazioni CRUD ci sono ancora alcune cose di cui dobbiamo parlare. Può capitare infatti di voler effettuare operazioni di inserimento , aggiornamento o eliminazione multipla ma che tali modifiche abbiano effetto solo se tutte le nostre query hanno successo. Stiamo parlando ovviamente di utilizzare le transazioni sul database. Yii consente di effettuare tutte le query in un'unica transazione in modo semplice e veloce.
$transaction = $model->dbConnection->startTransacation();
try
{
//Qui vanno inserite tutte le operazioni sul database
$transaction->commit();
}
Catch(Exception $e)
{
$transaction->rollback();
}