我有四个表:
pages: id, all_content, all_posts [...]
content: id, type [...]
posts: id, content_id [...]
pages_content: id, page_id, content_id, hidden
考虑到特定的页面ID,如果pages.all_content
或pages.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;
答案 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
查询可能会更好。