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は右優先。