При использовании through определение связи должно выглядеть следующим образом: 'comments'=>array(self::HAS_MANY,'Comment',array('key1'=>'key2'),'through'=>'posts'), Группа имеет комментарии через пользователей, а пользователи связаны через роли class Group extends CActiveRecord { public function relations() { return array( 'roles'=>array(self::HAS_MANY,'Role','group_id'), 'users'=>array(self::HAS_MANY,'User',array('user_id'=>'id'),'through'=>'roles'), 'comments'=>array(self::HAS_MANY,'Comment',array('id'=>'user_id'),'through'=>'users'), ); } } Запросы // получаем все группы с соответствующими им пользователями $groups=Group::model()->with('users')->findAll(); // получаем все группы с соответствующими им пользователями и ролями $groups=Group::model()->with('roles','users')->findAll(); // получаем всех пользователей и роли для группы с ID, равным 1 $group=Group::model()->findByPk(1); $users=$group->users; $roles=$group->roles; // получаем все комментарии для группы с ID, равным 1 $group=Group::model()->findByPk(1); $comments=$group->comments; Пользователь связан с адресом через профиль class User extends CActiveRecord { public function relations() { return array( 'profile'=>array(self::HAS_ONE,'Profile','user_id'), 'address'=>array(self::HAS_ONE,'Address',array('id'=>'profile_id'),'through'=>'profile'), ); } } Запросы // получаем адрес пользователя с ID, равным 1 $user=User::model()->findByPk(1); $address=$user->address; Особый случай - модель связана сама с собой через промежуточную таблицу Mentorship class User extends CActiveRecord { public function relations() { return array( 'mentorships'=>array(self::HAS_MANY,'Mentorship','teacher_id','joinType'=>'INNER JOIN'), 'students'=>array(self::HAS_MANY,'User',array('student_id'=>'id'),'through'=>'mentorships','joinType'=>'INNER JOIN'), ); } } Пример // получаем всех студентов учителя с ID, равным 1 $teacher=User::model()->findByPk(1); $students=$teacher->students;
Yii Справочник v0.05 © 2007-2024 Igor Salnikov aka SunDoctor