這裏是我的協會:使用中可容納強迫加入
- 收藏屬於關聯專輯
- 專輯屬於關聯藝術家
- 藝術家HABTM科
基本上我所要做的是使用中容納強制連接的行爲。如果用戶正在查看他的所有收藏夾,我想包含與該收藏夾相關聯的專輯,與該專輯相關聯的藝術家以及該藝術家所屬的部分。這將是很容易的與中可容納的行爲做像這樣:
$this->Favorite->find('all', array(
'contain' => array(
'Album' => array(
'Artist' => array(
'Section'
)
)
)
));
我的問題是,我也希望用戶能夠通過藝術家和專輯名稱進行搜索。不幸的是,我不能這樣做:
$this->Favorite->find('all', array(
...
'conditions' => array(
'OR' => array(
'Artist.name LIKE' => '%' . $this->request->query['query'] . '%',
'Album.name LIKE' => '%' . $this->request->query['query'] . '%'
)
)
));
爲什麼?因爲Cake只會執行第一次連接到Album
,並且它將爲藝術家執行單獨的查詢。所以,我必須做的,而不是什麼是去除中可容納的行爲,並做手工的加入,使我可以通過這兩個藝術家和專輯名稱,像這樣搜索:
$this->Favorite->find('all', array(
'fields' => array(
'Favorite.*',
'Album.*',
'Artist.*'
),
'conditions' => array(
'OR' => array(
'Artist.name LIKE' => '%' . $this->request->query['query'] . '%',
'Album.name LIKE' => '%' . $this->request->query['query'] . '%'
)
),
'joins' => array(
array(
'table' => 'albums',
'alias' => 'Album',
'type' => 'left',
'foreignKey' => false,
'conditions' => array('Album.id = Favorite.album_id')
),
array(
'table' => 'artists',
'alias' => 'Artist',
'type' => 'left',
'foreignKey' => false,
'conditions' => array('Artist.id = Album.artist_id')
)
)
));
這個偉大的工程,以能夠通過搜索藝術家和專輯名稱。我的問題是我也想包含藝術家所屬的部分。我不能只添加contain
密鑰,因爲Cake會複製Album
連接,這將引發「不唯一表別名」錯誤。
我的問題是,什麼是讓每個藝術家相關的部分,而無需通過每個收藏有循環和每個執行單獨的查詢的最佳,最有效的方法是什麼?或者這是我將不得不採取的路線?
你能舉個例子嗎? – Hoff