ここに私の協会があります:
- お気に入りの所属アルバム
- アルバム所属アーティスト
- アーティスト 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
し、アーティストに対して別のクエリを実行するためです。代わりに、containable 動作を削除し、結合を手動で行って、次のようにアーティスト名とアルバム名の両方で検索できるようにする必要がありました。
$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')
)
)
));
これは、アーティスト名とアルバム名で検索できるのに最適です。私の問題は、アーティストが属するセクションも含めたいということです。Cake が結合を複製し、'not unique table alias' エラーをスローするcontain
ため、キーを追加し直すことはできません。Album
私の質問は、各お気に入りをループしてそれぞれに対して個別のクエリを実行することなく、各アーティストに関連付けられたセクションを取得するための最良または最も効率的な方法は何ですか? それとも、これは私が取らなければならないルートですか?