在yii中使用CActiveDataProvider获取数据

Iva*_*hos 3 sql yii

我有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)')
Run Code Online (Sandbox Code Playgroud)

用户模型有下一个关系

'courses' => array(self::MANY_MANY, 'Courses', 'users_has_courses(Users_id, Courses_id)')
Run Code Online (Sandbox Code Playgroud)

请说明如何获取具有指定"id"的用户尚未使用CActiveDataProvider订阅的课程列表?换句话说,我需要这个简单的SQL查询的类比

select * from Courses where id not in (select Courses_id from users_has_courses where Users_id = 2)
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

tha*_*smt 5

尝试使用参数化的命名范围来封装查询,而不是常规的"关系".在您的课程模型中,添加此范围函数以获取用户不在的所有课程的列表:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后你应该能够做到这一点:

$coursesNotIn=new CActiveDataProvider(Courses::model()->userNotIn($user->id));
Run Code Online (Sandbox Code Playgroud)

此代码完全未经测试,但原则上应该有效.当我有一个复杂的查询时,我经常这样做,但我仍然想使用AR功能,如CActiveDataProvider.在这里阅读更多关于"命名范围"的信息:

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

祝好运!