postsとtagsはHABTMであるときに、tag_idの1か2をもつpostのみを抽出する場合、postsにposts_tagsをjoinして、更にtagsをjoinした上で、tag_idを条件に設定してfindする。
public function search(){
$this->Post->recursive = 0;
$options = array(
'joins' => array(
array(
'table' => 'posts_tags',
'alias' => 'PostsTag',
'type' => 'inner',
'conditions' => array(
'Post.id = PostsTag.post_id'
)
),
array(
'table' => 'tags',
'alias' => 'Tag',
'type' => 'inner',
'conditions' => array(
'PostsTag.tag_id = Tag.id'
)
)
),
'conditions' => array(
'Tag.id' => array(1,2)
),
'fields' => array(
'Post.created',
'Post.id',
'Post.title',
'User.name',
'Tag.keyword',
),
'group' => 'Post.id'
);
$posts = $this->Post->find('all',$options);
$this->set(compact('posts'));
}
left joinとinner joinの違いは、これ。inner joinはjoin元とjoin先が両方共情報があるものだけ抽出される。left joinは左優先。right joinは右優先。