笨:从两个表在一个循环中显示数据

笨:从两个表在一个循环中显示数据

问题描述:

比方说,我有两个数据库表:笨:从两个表在一个循环中显示数据

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的做法?

下面是该模型的方法两个提案:第一确实为每个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; ?> 
+0

这是很好的单独从博客模式的意见。所以你会有一个可以执行'$ this-> comments-> blog_id(5) - > return_number(10) - > order_by('desc') - > get()的评论模型,它将从blog_id获得10条评论年龄最早的。我喜欢使用完全可链接的方法,因为它减少了代码大小,非常简单,并且遵循与活动记录库相同的流程。我真的不是所有这些'$ blah-> get(array('option1'=>'val1','option2'=>'val2'))的粉丝;''我觉得写作是不必要的,想要在模型中重用这些值。 – 2011-04-17 16:35:20

+0

对,分开模型!这只是为了展示如何获得结果,然后代码可以移动到其他文件。顺便说一句好话 – Dalen 2011-04-17 16:38:26