(ну может и не сложные, но не простые)
Итак, есть таблица comments
Как мы видим, у нее есть поле cm_type , где перечислены возможные сущности, которым может принадлежать комментарий. В поле cm_belong_to лежит id (serial_id, episode_id, photo_id) сущности, которой принадлежит комментарий.
Задача состоит в том, чтобы выбрать все комментарии и автоматически подцепить к ним те реляционные отношения, которые необходимы. Меня интересует как можно (и можно ли?) ее решить с помощью использования relations класса CActiveRecord.
Можно выбрать все комментарии, потом в цикле пройтись по ним, посмотреть на cm_type , взять соответствующую модель (благо они так и называются) и сделать findbyPk по ней. И получить соответствующий объект, но тогда запросов к бд будет много. Хотя я даже не знаю, что делать потом - как приаттачить полученный объект как аттрибут к текущему объекту.
Сложные реляционные отношения
-
- Сообщения: 21
- Зарегистрирован: 2009.07.15, 13:59
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Сложные реляционные отношения
См. документацию по CActiveRecord::relations(). Там есть замечательный дополнительный параметр on.
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 21
- Зарегистрирован: 2009.07.15, 13:59
Re: Сложные реляционные отношения
А у тебя, случаем, нет примера отношения с параметром on ?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Сложные реляционные отношения
Код: Выделить всё
class Episode extends CActiveRecord {
function relations(){
return array(
'comments' => array(self::HAS_MANY, 'Comment', 'cm_belong_to', 'on' => "Comment.cm_type = 'episode'"),
);
}
}
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 21
- Зарегистрирован: 2009.07.15, 13:59
Re: Сложные реляционные отношения
Спасибо, все верно.
Если кому интересно, то поставленная задача решается так.
В модели Comment пишем такое:
В контроллере такое:
А в представлении такое:
Если кому интересно, то поставленная задача решается так.
В модели Comment пишем такое:
Код: Выделить всё
public function relations()
{
return array(
'user' => array(self::BELONGS_TO,'User','user_id','alias'=>'user'),
'episode' => array(self::BELONGS_TO, 'Episode', 'cm_belong_to','alias'=>'episode', 'on' => "cm_type = 'EPISODE'"),
'serial' => array(self::BELONGS_TO, 'Serial', 'cm_belong_to','alias'=>'serial', 'on' => "cm_type = 'SERIAL'"),
'photo' => array(self::BELONGS_TO, 'Photo', 'cm_belong_to','alias'=>'photo', 'on' => "cm_type = 'PHOTO'"),
);
}
Код: Выделить всё
$comments=Comment::model()->with('user','episode','serial','photo')->findAll($criteria);
Код: Выделить всё
<?php switch($comment->cm_type){
case "EPISODE":
echo "Эпизод: ".CHtml::link($comment->episode->ep_title, $this->createUrl('/admin/episodes/edit',array('episode_id'=>$comment->episode->episode_id)));
break;
case "SERIAL":
echo "Сериал: ".CHtml::link($comment->serial->sr_title, $this->createUrl('/admin/serials/edit',array('serial_id'=>$comment->serial->serial_id)));
break;
case "PHOTO":
echo "Фотография: ".CHtml::link($comment->photo->ph_title, $this->createUrl('/admin/photos/edit',array('photo_id'=>$comment->photo->photo_id)));
break;
}?>