2017-07-15 42 views
0

我擁有具有belongsToMany關係的Users和Courses表。用戶表具有如何使用CakePHP3獲取關聯的belongsToMany實體

$this->belongsToMany('Courses', [ 
    'foreignKey' => 'user_id', 
    'targetForeignKey' => 'course_id', 
    'joinTable' => 'courses_users' 
]); 

和CoursesTable具有

$this->belongsToMany('Users', [ 
    'foreignKey' => 'course_id', 
    'targetForeignKey' => 'user_id', 
    'joinTable' => 'courses_users' 
]); 

現在,我要取得與USER_ID課程。在我CoursesController,我試過

public function myCourses() 
{ 
    $id = $this->Auth->user('id'); 
    $courses = $this->Courses->find('all', 
     ['contain' => ['Users'], 
     'condition' => ['Courses.user_id' => $id] 
     ]); 
    $this->set('courses', $courses); 
} 

當我調試($課程)使用此代碼,我得到了「(幫助)」 =>「這是一個查詢對象,得到的結果執行或重複它。」信息。我正在搜索信息並試圖做很多小時,但我無法做到。我如何使用user_id獲取課程數據?提前致謝。

回答

2

如果它是一個連接表courses_users的擁有和屬於多(HABTM)關聯,那麼您的課程表中甚至不應該有user_id字段。

所以,現在,我們已經確定了,你不能做你試圖什麼(Courses.user_id),大家可以看一下,你以爲你正在嘗試:

$courses = $this->Courses->find('all', 
    ['contain' => ['Users'], 
    //'condition' => ['Courses.user_id' => $id] 
]); 

這是說「找到所有課程和任何與這些課程相關的用戶「。

但是你真正想要的(我相信)是:「找到屬於這個特定用戶的所有課程」。

爲此,您需要改爲使用matching()

根據the CakePHP book

一個相當普遍的情況下,查詢與關聯的查找記錄 「匹配」特定相關聯的數據。例如,如果您有'文章 belongsToMany標記',您可能會想要查找具有CakePHP標記的文章。這是非常簡單的 CakePHP中與ORM做:

$query = $articles->find(); 
$query->matching('Tags', function ($q) { 
    return $q->where(['Tags.name' => 'CakePHP']); 
}); 

所以你的情況,這將是這樣的:

$query = $courses->find(); 
$query->matching('Users', function ($q) use ($id) { 
    return $q->where(['Users.id' => $id]); 
}); 
+1

太謝謝你了!這正是我所問的!有一件事是我需要在「function($ q)」之後使用「($ id)」 $ query-> matching('Users',function($ q)use($ id){return} $ q-> where (['Users.id'=> $ id]); }); –

+1

很好的解釋! –