CodeIgniter:在一个循环中显示两个表中的数据

时间:2011-04-17 16:15:58

标签: php mysql codeigniter templates

假设我有这两个数据库表:

blog     comments
-------  ----------
blog_id  comment_id
title    blog_id
content  comment

现在我想浏览3个最新的博客条目,并显示该条目的标题,内容和评论数量。

为此,我创建了一个 Blog_model

function get_entries($n)
{
    if ($n < 1) {$n = 1;}

    $this->db->order_by("blog_id", "desc"); 
    $q = $this->db->get('blog', $n);

    if($q->num_rows() > 0) 
    {
        foreach ($q->result() as $row) 
        {
            $data[] = $row;
        }
        return $data;
    }
}

模型加载到控制器中并传递给视图:

$this->load->model('Blog_model');
$data['blog_rows'] = $this->Blog_model->get_entries(3);
$this->load->view('blog_view');

这给了我三个最新的博客条目。我现在可以遍历行并在视图中显示内容,如下所示:

<?php foreach ($blog_rows as $row): ?>

<h2><?=$row->title;?></h2>
<a href="#" class="comments">12></a>
<p><?=$row->content;?></p>

<?php endforeach; ?>

到目前为止一切顺利。但现在是棘手的部分:

我想显示与显示的博客条目相关的评论数量。我如何实现这一点,坚持CodeIgniter的做法?

1 个答案:

答案 0 :(得分:1)

以下是模型方法的两个建议:第一个对每个blod行执行查询,而第二个执行更快的唯一查询。第二个查询未经过测试。

模型1

function get_entries($n)
{
    if ($n < 1) {$n = 1;}

    $this->db->order_by("blog_id", "desc"); 
    $q = $this->db->get('blog', $n);

    if($q->num_rows() > 0) 
    {
        foreach ($q->result() as $row) 
        {
            $data[] = $row;
        }
        return $data;
    }

    foreach($data AS &$blog_e)
    {
       $q = "SELECT COUNT(*) AS count FROM comments WHERE blog_id = ?";
       $query = $this->db->query($q,array($blog_e->blog_id);
       $ncomments = $query->result_array();
       $blog_e->n_comments = $ncomments[0]['count'];
    }
}

模型2

function get_entries($n)
{
    if ($n < 1) {$n = 1;}

    $q = "SELECT blog.blog_id,title,content,COUNT(comment_id) AS n_comments
          FROM blog JOIN comments ON blog.blog_id = comments.blog_id
          GROUP BY blog.blog_id,title,content
          ORDER BY blog.blog_id DESC
          LIMIT 0,?"

    $query = $this->db->query($q,array($n));

    if($query->num_rows() > 0) 
    {
        foreach ($q->result() as $row) 
        {
            $data[] = $row;
        }
        return $data;
    }
}

查看

<?php foreach ($blog_rows as $row): ?>

<h2><?=$row->title;?></h2>
<a href="#" class="comments"><?=$row->n_comments?>></a>
<p><?=$row->content;?></p>

<?php endforeach; ?>