如何在CodeIgniter中关联数据表并在单篇文章中展示内容
搞定CodeIgniter数据表关联,轻松展示单篇文章的关联内容
嘿,我来帮你搞定这个表关联的问题!你有posts、users、categories三张表,要在单篇文章里显示作者和分类信息对吧?咱们一步步来:
1. 先把Post模型的关联查询写完整
你现在的post_model里的join没写完,咱们直接写个专门拿单篇关联文章的方法,也可以顺便优化下获取所有文章的方法:
单篇文章查询方法
在post_model.php里加这个方法,能直接拿到文章+作者+分类的完整数据:
public function get_post_by_id($id) { // 明确要查的字段,避免字段冲突 $this->db->select('posts.*, users.username, categories.name as category_name'); $this->db->from('posts'); // 关联users表:posts的user_id对应users的id $this->db->join('users', 'users.id = posts.user_id', 'left'); // 关联categories表:posts的cat_id对应categories的id $this->db->join('categories', 'categories.id = posts.cat_id', 'left'); $this->db->where('posts.id', $id); return $this->db->get()->row(); // 返回单条记录的对象,方便视图调用 }
所有文章的关联查询(可选)
如果列表页也需要显示作者和分类,就把你现有的get_posts()改成这样:
public function get_posts() { $this->db->select('posts.*, users.username, categories.name as category_name'); $this->db->from('posts'); $this->db->join('users', 'users.id = posts.user_id', 'left'); $this->db->join('categories', 'categories.id = posts.cat_id', 'left'); $this->db->order_by('posts.id', 'DESC'); return $this->db->get()->result(); // 返回所有文章的数组 }
2. 控制器里搞定单篇文章的逻辑
在Posts.php控制器里加一个展示单篇文章的方法,比如叫view,用来接收文章id并获取数据:
public function view($id) { // 调用模型拿单篇关联文章 $data['post'] = $this->post_model->get_post_by_id($id); // 如果找不到这篇文章,直接显示404页面 if (!$data['post']) { show_404(); } // 要是还需要分类列表之类的其他数据,继续加载就行 $data['all_categories'] = $this->category_model->get_all_categories(); // 加载视图,把数据传过去 $this->load->view('pages/post_view', $data); }
3. 视图里直接展示关联内容
比如在post_view.php这个单篇文章视图里,直接调用字段就行,超简单:
<h1><?php echo $post->title; ?></h1> <div class="post-meta"> <span>作者:<?php echo $post->username; ?></span> <span>分类:<?php echo $post->category_name; ?></span> </div> <div class="post-content"> <?php echo $post->content; ?> </div>
要是你在列表页展示所有文章,就循环输出:
<?php foreach ($posts as $post): ?> <div class="post-item"> <h3><?php echo $post->title; ?></h3> <p class="meta">作者:<?php echo $post->username; ?> | 分类:<?php echo $post->category_name; ?></p> <p><?php echo substr($post->content, 0, 100); ?>...</p> <a href="<?php echo site_url('posts/view/'.$post->id); ?>">阅读全文</a> </div> <?php endforeach; ?>
几个小提醒
- 用
left join是为了防止万一文章没有关联的用户或分类(比如user_id为空),也能正常显示文章内容;要是用inner join,这种没关联的文章就查不到了。 - 给分类名起
category_name别名是怕和其他表的name字段冲突,毕竟users表没有name,但以后加表的话就省心了。 - 记得确认数据库已经加载了,要么在模型构造里加
$this->load->database();,要么在config/autoload.php里把database设为自动加载。
内容的提问来源于stack exchange,提问作者Rino
相关产品推荐
相关产品推荐

