Yii Framework Forum: Declaring Relationship - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Declaring Relationship Rate Topic: -----

#1 User is offline   cardinal 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 11-January 11

Posted 20 January 2011 - 11:37 AM

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.yiiframew...ng-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>
<?php echo CHtml::encode($data->idTipoUtenteFK); ?>
<br />

?
0

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 20 January 2011 - 06:35 PM

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

#3 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 21 January 2011 - 02:00 AM

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
1

#4 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 21 January 2011 - 08:48 AM

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 =).
0

#5 User is offline   cardinal 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 11-January 11

Posted 21 January 2011 - 03:24 PM

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 />


0

#6 User is offline   cardinal 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 11-January 11

Posted 21 January 2011 - 04:41 PM

ce l' ho fatta!!!!!!!!
ma la relazione va messa da entrambe le parti
0

#7 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 22 January 2011 - 01:14 PM

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

#8 User is offline   cardinal 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 11-January 11

Posted 22 January 2011 - 01:58 PM

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
0

#9 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 24 January 2011 - 02:14 AM

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

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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users