paolo@bimodesign.com | +34 608 61 64 10

Framework

        

Yii : Suggerimenti per comunicare con il DB

In questo articolo, vi illustro alcuni suggerimenti utili per gestire la comunicazione con il DB (MySQL)

Richiamare funzioni native di MySQL
Per indicare a Yii che si vuole utilizzare una funzione nativa del database come valore del campo, si ha la necessita' di ricorrere ad una classe ausiliare. La classe in questione e' CDbExpression.
Nota: Consideriamo che la tabella si chiami User.

$user->data_iscrizione = new CDbExpression('now()');

In questo caso inseriremo la data di sistema nel campo data_iscrizione della nostra tabella
. Ovviamente ci sono alcune funzioni native del database che richiedono dei parametri. In questo caso

$user->password = new CDbExpression('md5(:pwd)', array(":pwd"=>"test"));

Il primo parametro e' la funzione che vogliamo richiamare con all'interno i parametri nel formato :nome parametro, dove i due punti fanno parte della sintassi
Il secondo parametro e' la lista dei parametri sotto forma di array associativo nel quale, la chiave corrisponde al parametro, sempre con i due punti, e il valore il valore che vogliamo passare.

Select su una 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);

dove:
$condizione rappresenta la condizione della query. In pratica corrisponde al where di una normale query sul database. La forma piu' comune e': 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.

La classe CDbCriteria
Ai metodi sopra indicati e' possibile passare anche un'istanza della classe CDbCriteria. Come suggerisce il nome questa classe fornisce i criteri per interrogare il database. La sintassi e' abbastanza semplice. Mediante questa classe e' possibile costruire la query passo per passo

$criteria = new CDbCriteria();
$criteria->select = "nome";
$criteria->condition = "user=:user";
$criteria->params = array(":user"=>"paolo");

E quindi

$usr = User::model()->find($criteria);


Limitazioni della classe CDBCriteria. E' possibile passare i criteri come un unico array chiave valore. La chiavi corrispondono alle proprieta' della classe CDbCriteria, quindi:

$usr = User::model()->find(
        array(
        'select'=>'nome',
        'condition'=>'user=:user',
        'params'=> array(":user"=>"ciro"),
        )
        );

Per individuare piu' 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);


Piu' transazioni sul DB
Puo' capitare di voler effettuare operazioni di inserimento, aggiornamento o eliminazione multipla ma che tali modifiche abbiano effetto solo se tutte le nostre query hanno successo. Yii mette a disposizione una struttura del genere

$transaction = $model->dbConnection->startTransacation();
try
{
    //Qui vanno inserite tutte le operazioni sul database 
    $transaction->commit();
    }
Catch(Exception $e)
    {
    $transaction->rollback();
    }


Alcuni metodi utili

User::model()->PrimaryKey(); // restituisce un array con le PK della tabella
User::model()->Count($conditions,$params); // come select count(*)
User::model()->countBySql($sql,$params); // effettua una count passando una select 
                                         // con i relativi parametri   
User::model()->exists($condition,$params); // verifica se esiste un determinato record
                                           // nella tabella


Il metodo Relations
Il nome indica chiaramente che in questo metodo si tiene conto delle relazioni che questa tabella ha con le altre.
I tipi di relazioni che possono esistere sono quelle tipiche dei database relazionali:

BELONGS_TO: relazione molti a uno
HAS_MANY: relazione una a molti
HAS_ONE: relazione uno a uno
MANY_MANY: relazione molti a molti

Un esempio del metodo relations e' il seguente:

public function relations()
    {
        return array(
        'relazione1'=>array(self::BELONGS_TO,'model2','campoRelazione')
        );
    }

Dove:

relazione1 indica il nome della relazione
self::BELONGS_TO Il tipo di relazione
model2 il model (tabella) a cui intendiamo collegarci
campoRelazione il campo del nostro model(tabella) legato alla tabella rappresentata da model2

A questo punto per utilizzare le relazioni non ci resta che richiamare un metodo di ricerca tipo find o
findAll
e insieme al metodo with

$user = User::model()->with('relazione1')->findAll();

Per ottenere un campo della tabella collegata e' sufficiente scrivere

$user->relazione1->nome_campo

Se vogliamo effettuare la join su piu' tabelle possiamo scrivere

$user = User::model()->with('relazione1','relazione2')->findAll();