Получение данных с CActiveDataProvider в yii - PullRequest
3 голосов
/ 06 декабря 2010

У меня есть 3 таблицы, стандартное отношение MANY-TO-MANY Пользователи (id, ...) -> Users_Has_Courses (Users_id, Courses_id) -> Курсы (id, ...)

Курсы Модель имеет следующее отношение

'users' => array(self::MANY_MANY, 'Users', 'users_has_courses(Courses_id, Users_id)')

Пользователи Модель имеет следующее отношение

'courses' => array(self::MANY_MANY, 'Courses', 'users_has_courses(Users_id, Courses_id)')

Скажите, пожалуйста, как я могу получить список курсов, на которые пользователь с указанным «id» не подписан на CActiveDataProvider? Другими словами, мне нужен аналог этого простого SQL-запроса

select * from Courses where id not in (select Courses_id from users_has_courses where Users_id = 2)

спасибо за помощь

1 Ответ

5 голосов
/ 06 декабря 2010

Вместо обычного «отношения», попробуйте параметризованную именованную область для инкапсуляции запроса. В вашей модели курсов добавьте эту функцию области видимости, чтобы получить список всех курсов, в которых нет пользователя:

public function userNotIn($user_id)
{
  $criteria=new CDbCriteria();
  $criteria->condition .= 't.id NOT IN (SELECT users_has_courses.Courses_id FROM users_has_courses WHERE users_has_courses.Users_id = :userid)';
  $criteria->params[':userid'] = $user_id;
  $this->getDbCriteria()->mergeWith($criteria);
  return $this;
}

Тогда вы сможете сделать это:

$coursesNotIn=new CActiveDataProvider(Courses::model()->userNotIn($user->id));

Этот код полностью не проверен, но в принципе должен работать. Я часто так поступаю, когда у меня сложный запрос, но я все еще хочу использовать функции AR, такие как CActiveDataProvider. Подробнее об «именованных областях» читайте здесь:

http://www.yiiframework.com/doc/guide/1.1/en/database.ar#parameterized-named-scopes

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...