You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:09:43