{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array( 'tipoUtente'=>array(self::HAS_MANY, 'TipoUtente', 'idTipoUtenteFK'),);
}
Ti porto l’esempio di un lavoro che sto facendo in questo momento: ho un sito con diversi eventi e ad ogni evento ci si può iscrivere. Quindi avremo la tabella eventi e la tabella iscrizioni. La tabella iscrizioni con una chiave esterna. Per completezza:
CREATE TABLE IF NOT EXISTS `eventi` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(10) NOT NULL,
`titolo` varchar(250) NOT NULL,
`descrizione` text NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `iscrizioni` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_evento` int(11) NOT NULL,
`ragionesociale` varchar(250) NOT NULL,
`provincia` varchar(250) NOT NULL,
`riferimento` varchar(250) NOT NULL,
`telefono` varchar(250) NOT NULL,
`fax` varchar(250) NOT NULL,
`email` varchar(250) NOT NULL,
PRIMARY KEY (`id`)
);
PS. Non metto mai la chiave esterna in MySQL, ma questo è un problema di "stile".
Tornando a Yii … ho creato i rispettivi model ed i rispettivi crud con gii ed aggiunto la relazione al model delle iscrizioni:
public function relations () {
return array(
'nome_evento'=>array(self::BELONGS_TO, 'Eventi', 'id_evento'),
);
}
Data un’iscrizione, per mostrare il nome dell’evento devo richiamare $model->nome_evento->titolo;
Questo non lo sapevo zaccaria. Magia! Yii mi stupisce ogni giorno di più. Ed io ti ringrazio ogni giorno di più =). Dato che ci sono… aggiungo anche il codice che ho sostituito nella pagina admin.php della view di iscrizioni del mio stesso esempio:
Come noti, la colonna ‘nome_evento.description’ è ovviamente il campo description della tabella esterna cui fa riferimento la relazione nome_evento di questo model. Questo codice mi sembrava così logico che ho provato prima ancora di leggerlo in un manuale. Non solo. Sempre nel model ho fatto un altro tentativo:
Serve solo una relazione per quello che fai tu, ma comunque è meglio metterle tutte.
Se da una parte hai una BELONGS_TO dall’altra avrai una HAS_MANY.
Per esempio se hai studente BELONGS_TO classe, per ottenere la classe dello studente ti serve che in studente sia definita la belongs to per fare $studente->classe0
Se invece ti servono gli studenti di una classe serve che sia definita la has many in classe, per chiamare $classe->studentes (che restitusce un array)
Ovviamente, dato che le relations non costano niente, conviene dichiararle tutte e poi usi solo quelle che ti servono.
Usa INNO_DB con le foreign key come database, Yii genera tutte le relazioni da solo e non ci pensi più.