Non conosco il tuo database quindi provo ad aiutarti facendoti un esempio concreto che ho sviluppato qualche tempo fa. Supponiamo che il tuo database sia questo:
CREATE TABLE IF NOT EXISTS `citta` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(50) NOT NULL, PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `citta` (`id`, `nome`) VALUES (1, 'Cesena'), (2, 'Forlì');
CREATE TABLE IF NOT EXISTS `paesi` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(50) NOT NULL, `citta` int(11) NOT NULL, PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
INSERT INTO `paesi` (`id`, `nome`, `citta`) VALUES (1, 'San Carlo', 1), (2, 'San Vittore', 1), (3, 'Ronco', 2);
(devi scusarmi ma mi perde la formattazione, spero di non crearti troppi problemi).
gii lo conosci già, quindi non sto a raccontarti tutta la storia. In questo esempio, dovresti ritrovarti qualche cosa del tiupo
'cittadina' => array(self::BELONGS_TO, 'Citta', 'citta'),
dentro alle relations del Model che importa la chiave esterna.
Adesso devi andare nel datagrid devi aggiungere una chiave esterna:
array( 'name' => 'cittadina', 'filter' => CHtml::activeTextField($model, 'cittadina'), 'value' => '$data->cittadina->nome',
),
Per completezza (non odiarmi ma ho il solito problema di formattaazione… se più tardo ho tempo modifico il post, promesso)
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id' => 'paesi-grid', 'dataProvider' => $model->search(), 'filter' => $model, 'columns' => array(
'id', 'nome', array(
'name' => 'cittadina', 'filter' => CHtml::activeTextField($model, 'cittadina'), 'value' => '$data->cittadina->nome',
), array(
'class' => 'CButtonColumn', ),
), ));
?>
Ce l’abbiamo quasi fatta. Adesso dobbiamo mettere mano al Controller:
public function search() { $criteria = new CDbCriteria;
$criteria->compare('nome', $this->nome, true); $criteria->compare('cittadina.nome', $this->cittadina, true); $criteria->join = 'join citta on citta.id = t.citta'; $criteria->with = array('cittadina');
return new CActiveDataProvider(get_class($this), array( 'criteria' => $criteria,
));}
Se ci sono casi di omonimia tra le due tabelle, in oltre, devi aggiungere la dot notation di yii (una piccola t. prima del nome):
public function search() { $criteria = new CDbCriteria;
$criteria->compare('t.nome', $this->nome, true); $criteria->compare('cittadina.nome', $this->cittadina, true); $criteria->join = 'join citta on citta.id = t.citta'; $criteria->with = array('cittadina');
return new CActiveDataProvider(get_class($this), array( 'criteria' => $criteria,
));
Spero di essere stato semplice nel spiegarti questa cosa. Fammi sapere se è tutto ok.