笨:从两个表在一个循环中显示数据
问题描述:
比方说,我有两个数据库表:笨:从两个表在一个循环中显示数据
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; ?>
这是很好的单独从博客模式的意见。所以你会有一个可以执行'$ 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
对,分开模型!这只是为了展示如何获得结果,然后代码可以移动到其他文件。顺便说一句好话 – Dalen 2011-04-17 16:38:26