Подскажите правильное решение по выборке

Всем доброго времени суток! Подскажите пожалуйста решение по такой проблеме:

Есть три таблицы:

  1. Список СМИ - smi(id,name)

  2. Список Стран - country(id,name)

  3. Сводная таблица - smi_country(smi_id,country_id)

relations в smi:




'country' => array(self::MANY_MANY, 'country', 'smi_country(smi_id, country_id'),



relations в country:




'smi' => array(self::MANY_MANY, 'smi','smi_country(country_id, smi_id)'),



relations в smi_country:




'smi' => array(self::HAS_MANY, 'smi', 'id'),

'country' => array(self::HAS_MANY, 'country', 'id')



В контроллере получаю список сми:




$criteria=new CDbCriteria(array('with'=>array('country')));

if(isset($_GET['country']))

   $criteria->addCondition('country.id='.$_GET['country']);

$dataProvider=new CActiveDataProvider('Smi', array('criteria'=>$criteria));



И в виде, через CListView


 $this->widget('zii.widgets.CListView', 

    array('dataProvider'=>$dataProvider,

          'itemView'=>'_view'));



вывожу список сми такого вида:




echo 'Газета:'.$data->name;

echo 'Страна:';

foreach ($data->country as $c) {

    echo CHtml::link(CHtml::encode($c->name), array('smi/index','country'=>$c->id));

}




Газета: "Курьер"

Страна: Россия, Украина


Газета: "Премьер"

Страна: Россия


Здесь все хорошо, но когда нужно выбрать СМИ по какой-то одной стране (country=2), то СМИ выводится правильно, но страна у него выводится только та, по которой делали выборку:


Газета: "Курьер"

Страна: Украина


Подскажите, как правильно вывести список стран к каждому СМИ?

То ли нужно делать для country нового dataProvider, то ли можно как-то составить relations? Либо еще как-то?

попробуйте так

  1. добавьте в smi relation

'smi_country' => array(self::HAS_MANY, 'SmiCountry','smi_id'),


$criteria=new CDbCriteria(array('with'=>array('country')));

замените на


$criteria=new CDbCriteria(array('with'=>array('country','smi_country')));


if(isset($_GET['country']))

   $criteria->addCondition('country.id='.$_GET['country']);



это замените на


if(isset($_GET['country']))

   $criteria->addCondition('smi_country.country_id='.$_GET['country']);

Огромное спасибо! Работает! Т.е. надо было сделать отдельный доступ к сводной таблице smi_country и применять условие к ней, а не к country!

Единственное - добавил в relations к smi_country параметр ‘together’=>true;

для раздельного запроса, а то без него выводит сообщение:


Column not found: 1054 Unknown column 'smi_country.country_id' in 'where clause'