Сложные реляционные отношения

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
kaiser Zaido
Сообщения: 21
Зарегистрирован: 2009.07.15, 13:59

Сложные реляционные отношения

Сообщение kaiser Zaido »

(ну может и не сложные, но не простые)

Итак, есть таблица comments

Изображение

Как мы видим, у нее есть поле cm_type , где перечислены возможные сущности, которым может принадлежать комментарий. В поле cm_belong_to лежит id (serial_id, episode_id, photo_id) сущности, которой принадлежит комментарий.

Задача состоит в том, чтобы выбрать все комментарии и автоматически подцепить к ним те реляционные отношения, которые необходимы. Меня интересует как можно (и можно ли?) ее решить с помощью использования relations класса CActiveRecord.

Можно выбрать все комментарии, потом в цикле пройтись по ним, посмотреть на cm_type , взять соответствующую модель (благо они так и называются) и сделать findbyPk по ней. И получить соответствующий объект, но тогда запросов к бд будет много. Хотя я даже не знаю, что делать потом - как приаттачить полученный объект как аттрибут к текущему объекту.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Сложные реляционные отношения

Сообщение samdark »

См. документацию по CActiveRecord::relations(). Там есть замечательный дополнительный параметр on.
kaiser Zaido
Сообщения: 21
Зарегистрирован: 2009.07.15, 13:59

Re: Сложные реляционные отношения

Сообщение kaiser Zaido »

А у тебя, случаем, нет примера отношения с параметром on ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Сложные реляционные отношения

Сообщение samdark »

Код: Выделить всё

class Episode extends CActiveRecord {
   function relations(){
      return array(
        'comments' => array(self::HAS_MANY, 'Comment', 'cm_belong_to', 'on' => "Comment.cm_type = 'episode'"),
      );
   }
}
 
kaiser Zaido
Сообщения: 21
Зарегистрирован: 2009.07.15, 13:59

Re: Сложные реляционные отношения

Сообщение kaiser Zaido »

Спасибо, все верно.

Если кому интересно, то поставленная задача решается так.
В модели 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;

        }?>
Ответить