【问题标题】:Getting data with CActiveDataProvider in yii在 yii 中使用 CActiveDataProvider 获取数据
【发布时间】:2011-05-21 00:38:11
【问题描述】:

我有 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)')

Users 模型有下一个关系

'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)

感谢您的帮助

【问题讨论】:

    标签: sql yii


    【解决方案1】:

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

    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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多