Logicky Blog

Logickyの開発ブログです

cakePHP HABTMのテーブルをJOINして検索する

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