Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Metodi utili, scope e relazioni

Metodi utili nella gestione dei dati e definizione degli scope in Yii
Metodi utili nella gestione dei dati e definizione degli scope in Yii
Link copiato negli appunti

Uno dei metodi che la nostra classe User eredita da CActiveRecord, ma che non è visibile nel nostro file , è primaryKey. L'utilità di questo metodo è ovvia: restituisce la chiave primaria della tabella. Nel caso che la tabella abbia come chiave un gruppo di campi, questi saranno restituiti sottoforma di array e non di singolo elemento. In pratica invece di return 'chiave'; avremo return array('k1','k2');.

Altre funzioni utili sono:

User::model()->Count($conditions,$params);
User::model()->countBySql($sql,$params);
User::model()->exists($condition,$params);

I nomi dei metodi sono abbastanza esplicativi. Ad ogni modo il primo metodo consente di eseguire una query di conteggio (come select count(nome campo) FROM tabella $condizione) passando la condizione e i parametri necessari. Il secondo metodo consente di effettuare il conteggio passando una intera query e i relativi parametri. Infine il terzo metodo verifica l'esistenza di un determinato record nel database in base alla condizione e i parametri passati.

Un altro metodo molto importante è relations. Il nome indica chiaramente che in questo metodo si tiene conto delle relazioni che questa tabella ha con le altre. Ovviamente se abbiamo due tabelle in relazione tra loro, questo metodo riporterà, in ognuno dei model che le rappresentano, la relazione. La differenza consisterà nel tipo di relazione. Affinché Yii riconosca in automatico le relazioni, e quindi che il modulo gii sia in grado di creare i model con le relazioni, è necessario che nel database sia creata una relazione esterna fra campi. In caso contrario è sempre possibile creare le relazioni manualmente modificando il metodo relations.

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 è il seguente:

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

In cui:

  • 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 è sufficiente scrivere

$user->relazione1->nome_campo

Se vogliamo effettuare la join su più tabelle possiamo scrivere

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

È possibile sfruttare le relazioni delle tabelle anche usando i criteri.

$criteria = new CDbCriteria();
$criteria->with = "relazione1";
$user = User::model()->findAll($criteria);

oppure

$criteria->with = array('relazione1','relazione2');

Uno degli aspetti più interessanti del model è rappresentato dalla possibilità di utilizzare gli scopes. Se vi state chiedendo cosa sia uno scope possiamo semplificare dicendo che uno scope è un sistema che consente di applicare un criterio di query, o
più criteri combinati tra loro, su un active record. Esistono due modi diversi per definire uno scope all'interno del nostro model. Nel primo caso ogni scope è indice di un unico array definito all'interno del metodo scopes:

public function scopes()
	{
		return array(
	            'admin'=>array(
	                'condition'=>'status=1',
		),
	            'date'=>array(
	                'order'=>'date DESC',
	                'limit'=>5,
		),
		);
	}

Per applicare lo scope alla nostra query è sufficiente un codice come il seguente:

$user = User::model()->admin->findAll();

oppure:

$user = User::model()->date->findAll();

e per finire la combinazione dei due:

$user = User::model()->admin->date->findAll();

La soluzione proposta va bene in caso di scope e filtri che non richiedono parametri passati dall'utente. Infatti, se volessimo passare dei parametri al nostro scope, la sintassi da utilizzare è come quella che segue:

public function dataIscrizione($date)
	{
		$this->getDbCriteria()->mergeWith(array(
			'condition'=>"data_iscrizione >= '$date'"
		));
		return $this;
	}

Quindi il codice precedente può essere scritto nel modo seguente:

$oggi = date("Y-m-d");
$user = User::model()->admin->dataIscrizione($oggi)->findAll();

Il codice proposto nell'ultimo metodo è abbastanza semplice. Il metodo non fa altro che "prelevare" i criteri che già sono applicati al model, infatti $this nel contesto rappresenta il model, ed aggiungere quelli definiti nello scope mediante il metodo, della classe CDbcriteria, mergeWith.

Ti consigliamo anche