2017-07-15 13 views
0

belongsToMany関係のユーザーとコーステーブルがあります。 USERTABLEはCakePHP3で関連するbelongsToManyエンティティを取得する方法

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

を持っており、CoursesTableは私がuser_idを持つコースを取得したい、今すぐ

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

を持っています。私の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); 
} 

を試してみました、私は「(ヘルプ)」を得た=>「これは、結果が実行取得したり、それを繰り返すために、Queryオブジェクトです。」メッセージ。私は情報を探して何時間もやろうとしていますが、それはできません。 user_idでコースデータを取得するにはどうすればよいですか?前もって感謝します。

答えて

2

結合テーブルがcourses_usersのHADB(has-and-belong-to-many)関連の場合は、コーステーブルに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

ありがとうございました!これはまさに私が尋ねたものです! 1つは、 "function($ q)"の後に "use($ id)"が必要だということです。 $ query-> matching( 'Users'、function($ q)use($ id){ return $ q-> where (['Users.id' => $ id]); }); –

+1

素敵な説明! –

関連する問題