Ciao e buongiorno a tutti, oggi ho provato a impostare le relations sul mio model ma mi torna un errore :s
Ho due tabelle tbl_Persone che appartengono ad un distretto quindi ho una seconda tblDistretti e dentro la tabella Persone ho la chiave esterna(FK) dei distretti.
Ora se volessi mostrare in una zii.widgets.grid.CGridView (delle Persone) il dato (‘distretto’), provando così :
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'distretto' => array(self::HAS_ONE,'Distretti','distretto_appartenenza'),
);
}
Abbiamo un po’ poche informazioni. Potresti mostrarci il database? distretto_appartenenza è la chiave esterna? Io in genere uso sempre self::BELONGS_TO, c’è una ragione per cui tu hai pensato di usare HAS_ONE?
Nella function relations() all’interno di /protected/models/PersonaModel.php
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'distretto' => array(self::HAS_ONE,'DistrettiSanitari','distretto_appartenenza'),
);
}
e poi nella view lo uso nella proprietà columns del zii.widgets.grid.CGridView:
Nessuna anima pia ?! Ha qualche consiglio ? Mi è sorto un dubbio … devo agire a livello database ? Definire la relazione anche lì (oltre a creare i campi dico) ?
paskuale, non e’ necessario creare la relazione anche nel db, ma e’ molto pratico.
Prova a fare cosi’: crea la relation nel db e poi usa gii per rigenerare il model (non serve che lo rigeneri per davvero, basta che fai la preview e copi il codice della relations).
Cosi’ non ti stai a imparare come configurare le relations, lascia che sia gii a farlo per te.
Creare la relazione anche nel db, se ho inteso bene quello che intendi, significa poter dipendere da quel DB. Questo non ha molto senso. La mia affermazione può sembrare strana, ma l’ORM di yii ci consente di interrogare tutti i db con query standard. Questo è fantastico, perché possiamo passare da mysql a sqlite senza accorgercene. Se iniziamo a dipendere dal database, il giochino non funziona più. Suggerisco di dipendere dal DB se e solo se si è sicuri al 100% che il db non cambierà.
[s]Da quello che mi pare di aver capito, l’utilizzo di HAS_ONE e BELONGS_TO dipende dalla cardinalità minima quando la relazione non è di tipo molti.
HAS_ONE quando c’è una relazione di tipo opzionale, mentre BELONGS_TO quando la relazione è obbligatoria.
Quindi se la persona PUO’ appartenere ad un distretto dovrebbe essere HAS_ONE (cardinalità minima 0, cardinalità massima 1), mentre se la persona DEVE avere un distretto di appartenenza si usa BELONGS_TO (cardinalità minima 1, cardinalità massima 1)
Condivido le considerazioni di sensorario sul "non dipendere dal database"… e anche vero che definendo le relazioni a livello di database Gii riporterà queste informazioni nei modelli: lavoro risparmiato!!
Nell’ipotesi tu utilizzi Mysql, le tabelle, al fine di supportare le relazini, devono essere di tipo INNODB. La creazione delle relazioni può esser fatta in due modi:
Con il Tool "Designer" di PhpmyAdmin
tramite codice SQL. A livello di esempio ti riporto il codice di creazione di una tabella con una chiave primaria e due chiavi esterne
CREATE TABLE IF NOT EXISTS `tbl_phone` (
`id_phone` int(11) NOT NULL AUTO_INCREMENT,
`tipi_phone_id` int(11) NOT NULL,
`numero` varchar(64) NOT NULL,
`azienda_id` int(11) NOT NULL,
PRIMARY KEY (`id_phone`),
FOREIGN KEY (`azienda_id`) REFERENCES tbl_azienda(id_azienda),
FOREIGN KEY (`tipi_phone_id`) REFERENCES tbl_tipi_phone(id_tipi_phone)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1