Declaring Relationship

Ciao a tutti mi serve urgentemente una mano

per riuscire a displaiare

con CListView, come nella app di default

una tabella referenziata,

ho seguito il tutorial http://www.yiiframework.com/doc/guide/1.1/en/database.arr#declaring-relationship

ma non ci riesco

la relazione penso di averla dichiarata bene

ho lke tabelle Utenti E tipoUtente

idTipoUtenteFK è dentro utenti

ho fatto

dentro TipoUtente model

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( 'tipoUtente'=>array(self::HAS_MANY, 'TipoUtente', 'idTipoUtenteFK'),);


}

e dentro Utenti model

‘utente’ => array(self::BELONGS_TO, ‘Tipoutente’, ‘idTipoUtenteFK’),

ma poi come displaio la proprietà

quì dentro _view <b><?php echo CHtml::encode($data->getAttributeLabel(‘idTipoUtenteFK’)); ?>:</b>

&lt;?php echo CHtml::encode(&#036;data-&gt;idTipoUtenteFK); ?&gt;


&lt;br /&gt;

?

Devi fare in questo modo:

$data->tipoUtente->NOME_DEL_CAMPO_NON_CHIAVE_DELLA_TABELLA_ESTERNA

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;

Spero di esserti stato utile.

Per fare le cose facili, usa innoDB come motore do memorizzazione in sql ed imposta le chiavi esterne.

Cosi’ facendo Gii ti genera i modelli con tutte le relation impostate, e non hai dubbi se le hai scritte correttamente.

Per il resto segui i consigli di sensorario

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:




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

    'id' => 'iscrizioni-grid',

    'dataProvider' => $model->search(),

    'filter' => $model,

    'columns' => array(

      'nome_evento.description',

      'ragionesociale',

      'provincia',

      'riferimento',

      'telefono',

      array(

        'class'=>'CButtonColumn',

      ),

    ),

  )); ?>



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:




    public function attributeLabels() {

      return array(

        'id' => 'ID',

        'id_evento' => 'Id Evento',

        'ragionesociale' => 'Ragione Sociale',

        'provincia' => 'Provincia',

        'riferimento' => 'Riferimento (Sig. Sig.ra)',

        'telefono' => 'Recapito telefonico',

        'fax' => 'Fax',

        'email' => 'Email',

        'nome_evento.description' => 'Titolo dell\'evento',

      );

    }



In pratica, quando nella CGridView chiamo questo model, definisco la label del campo esterno. Io mi sono innamorato =).

grazie a entrambe la label mi funziona ma il dato ancora non mi arriva.




nel model

'tipoUtente' => array(self::BELONGS_TO, 'TipoUtente', 'idTipoUtenteFK'),




view

<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		'idUtentiPK',

		'nome',

		'cognome',

		'email',

		'userName',

		'password',

		'idTipoUtenteFK',

		'dataAggiornamento',

		'tipoUtente.descrizioneTipoUtente',

	),

)); ?>





_view

	<b><?php echo CHtml::encode($data->getAttributeLabel('tipoUtente.descrizioneTipoUtente')); ?>:</b>

	<?php echo CHtml::encode($data->tipoUtente.descrizioneTipoUtente); ?>

	<br />




ce l’ ho fatta!!!!!!!!

ma la relazione va messa da entrambe le parti

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

sì è quello che ho fatto fin dall’ inizio innodb con relazioni che si sono generate con gii

grazie

ora ho dei problemi coi form

ma faccio un altro post magari

Per le form dai un’occhiata a questa parte della guida.

Se hai altri dubbi apri un’altro thread, ti rispondiamo.