CodeIgniter:联接表并保留主表中的所有行

时间:2019-07-05 23:50:27

标签: php mysql join codeigniter-3

我有四个表:

pages: id, all_content, all_posts [...]  
content: id, type [...]  
posts: id, content_id [...]  
pages_content: id, page_id, content_id, hidden

考虑到特定的页面ID,如果pages.all_contentpages.all_posts设置为1,我想获取所有内容/帖子行。
另外,我想获取所有pages_content.hidden列,其中page_id == pages.id以及与之关联的内容/帖子行,而不管all_content / all_posts。

我想为此使用CI的数据库功能。

这是我的代码;它只会返回pages_content表中表示的内容,但除此之外,它确实会在涉及all_content / all_posts值的情况下提供预期的结果。

    $this->db->select('all_content, all_posts');
    $query = $this->db->get_where('pages', [ 'id' => $id ]);

    if ($query->num_rows())
    {
        $auto = $query->row();
        $query->free_result();

        $this->db->join('posts', 'posts.content_id = content.id');
        $this->db->join('pages_content', 'content.id = pages_content.content_id');

        $this->db->order_by('publish_date', 'DESC');
        $this->db->select('content.id, uri, hidden, type, title, publish_date');

        $this->db->where('pages_content.page_id', $id);
        $this->db->or_where('type = "posts" AND ('.$auto->all_content.' OR '.$auto->all_posts.')');

        $query = $this->db->get('content');
        $result = $query->result();
        $query->free_result();

        return $result;
    }

    $query->free_result();

    return FALSE;

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我发现了LEFT JOIN子句,其中包括“ left”表中的所有行(在本例中为content)。
在CodeIgniter中,这是通过将其添加为join方法中的第三个参数来完成的。

所以这似乎是解决方案:

    $this->db->select('all_content, all_posts');
    $query = $this->db->get_where('pages', [ 'id' => $id ]);

    if ($query->num_rows())
    {
        $auto = $query->row();
        $query->free_result();

        $this->db->join('pages_content', 'pages_content.content_id = content.id AND page_id = '.$id, 'left');
        $this->db->join('posts', 'posts.content_id = content.id', 'left');

        $this->db->order_by('publish_date', 'DESC');
        $this->db->select('content.id, uri, hidden, type, title, publish_date');

        if (!$auto->all_content)
        {
            $this->db->where('page_id', $id);
            if ($auto->all_posts) $this->db->or_where('type = "posts"');
        }

        $query = $this->db->get('content');
        $result = $query->result();
        $query->free_result();

        return $result;
    }

    return FALSE;

尽管在主查询中也包含pages查询可能会更好。