relazioni nei models

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'),

);

}

:unsure: non và …

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?

Ho usato HAS_ONE perchè era l’unico + plausibile, cmq la relazione è la Persona ha solo un Distretto.

si, che risiede nella tbl_Persona.

Se qui è tutto ok, … forse l’errore potrebbe aiutarci ad aiutarti. Qui sembra andare tutto bene.

Ah! Non farebbe male nemmeno capire dove usi questa relazione e come la usi. Magari l’errore è causato da quel codice.

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:


$this->widget('zii.widgets.grid.CGridView', array(

	'dataProvider'=>$dataProvider,

	'columns'=>array

		(

			'distretto',

			'idoneo',

		),

)); 

allego una immagine magari spiega meglio la mia situazione ::) 2460

relations.jpg

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) ?

thanks

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.

grazie zaccaria :rolleyes: :unsure: ma mi manca il “come realizzare relazioni direttamente nel db” me la studio cmq può sempre servire ;)

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)

[/s]

Questo wiki chiarisce un po’ meglio le idee:

belongs_to vs has_one

Mmmm io direi che HAS_ONE può essere utilizzato in caso di relazioni 1:1 mentre BELONGS_TO in caso di relazioni 1:N.

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:

  1. Con il Tool "Designer" di PhpmyAdmin

  2. 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 




Spero ciò ti sia utile

Ma è possibile fare un join senza utilizzare chiavi esterne?

Tu che cosa intendi per join? Forse tu intendi dire la union.