2014-02-08 81 views
0

快速设置:UserhasAndBelongsToManyCourseCakePHP的检索HABTM数据

 courses_users 
__________________________ 
id | user_id | course_id | 
1 |  1 |   1 | 
2 |  1 |   3 | 
3 |  2 |   5 | 

我需要加载的所有CoursesUserusers.id = 1

我尝试这样:

$this->User->id = $this->Auth->user('id'); 
$courses = $this->User->Courses->find('all'); 

但上面的代码检索所有的课程,而不是与用户相关联的那些

回答

1

因为你的关系是机智,你需要做到以下几点:

$this->User->read(null, $id); 
or 
$this->User->find('first', array('conditions'=>array('id'=>1))); 

它应该也返回为用户开设的课程。它取决于你的应用程序,但我会使用Containable行为来检索只有课程,但真正取决于你与用户模型有多少关系。

有中可容纳的行为,你应该像加载只有课程的关系:

$this->User->find('first', 
    array(
     'conditions'=>array('id'=>1), 
     'contain'=>array('Courses'))); 
+0

使用递归= 1;第一行就够了。但是,你能举一个我怎么能得到可容忍行为的例子吗?该文件不够清楚。 –

+0

可封闭行为是CakePHP中包含的核心行为。通常我只是将它包含在AppModel中,如: public $ actsAs = array('Containable',...);然后,您可以在find中使用它,就像指定关系表一样简单。这是一个很好的习惯,因为如果你有很多关系,但是你只需要很少的关系,那么你可以用它轻量化查询。我认为Containable behavior doc很清楚:bit.ly/1gjCtRc –

0
$course_ids = $this->CoursesUser->find('list', array('conditions'=>array('user_id'=>$this->Auth->user('id')), 'fields'=>'course_id')); 

$courses = $this->Course->find('all', array('conditions'=>array('id'=>$course_ids))); 
+0

这是行不通的,因为课程没有一个user_id列。由于它是一个HABTM关系,中间表有两个外键 –

+0

你是什么意思名称字段? –

+0

是的,courses_users,他们有一个HABTM关系 –