2013-06-21 145 views
0

這裏是我的協會:使用中可容納強迫加入

  • 收藏屬於關聯專輯
  • 專輯屬於關聯藝術家
  • 藝術家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連接,這將引發「不唯一表別名」錯誤。

我的問題是,什麼是讓每個藝術家相關的部分,而無需通過每個收藏有循環和每個執行單獨的查詢的最佳,最有效的方法是什麼?或者這是我將不得不採取的路線?

回答

-1

嗯,我已經成功地得到這個想出了(髒)黑客:

$this->Favorite->find('all', array(
    'contain' => array(
     'Album' => array(
      'Artist' => array(
       'Section' 
      ) 
     ) 
    ), 
    'conditions' => array(
     'OR' => array(
      '(SELECT name FROM artists WHERE id = Album.artist_id) LIKE' => '%' . $this->request->query['query'] . '%', 
      'Album.name LIKE' => '%' . $this->request->query['query'] . '%' 
     ) 
    ) 
)); 
0

你不能混搭containablejoins,所以你需要做的事情略有不同。

創建與bindModel飛一些額外的關係,那麼你就可以在使用中可容納標準的關係,使用條件的新關係。

+0

你能舉個例子嗎? – Hoff