2014-02-08 118 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關係 –