在这种情况下从视图调用模型的替代方法

时间:2012-05-25 14:58:13

标签: php model-view-controller

我知道我们假设从控制器调用模型而不是视图,但我遇到的情况是我必须这样做

这里是:

我有一个博客脚本,在每个用户主页中我想为每个帖子显示10篇帖子和5条评论

所以我的控制器看起来像

function get_posts($user_id){

   $blog_model = $this->load->model('bloging');
   $posts      = $blog_model->get_user_posts();
   $this->load->view('blog' , $posts )
}

每篇文章都有很多评论 所以我必须得到它们

所以在我看来我有

foreach($posts->result() as  $p ){

  echo $p->comment;

 /// getting comments
  $comment_model = $this->load->model('comments');
  $co = $comment_model->get_post_comments($p->id);
  foreach($co as $co )
   echo $co->comment;
  //////


}

我现在这样不起作用,因为我必须使用帮助器或库或在模型中使用静态方法来执行此操作(我使用codeigniter,它可能与其他框架工作不同)

但我有什么选择?

我可以在控制器中执行此操作,在获取帖子后使用foreach循环并获取每个帖子评论,将所有评论放入二维数组($c_array[post_id][it's comments array]

将他们发送到带有帖子的视图,并在每个帖子的视图中查看数组中的评论和.......

但它接缝复杂,冗余且较慢

我已经在帖子查询上有4个连接,在评论查询上有2个连接,如果我加入这两个,那将是7个

并且两个查询中的select有不同的限制 我对mvc很新。在这种情况下,正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

通常情况下,post模型上会有一个方法来获取该帖子的评论。另外,我通常会有一种方法来确保评论已加入帖子中,因此您不会为每个帖子发出评论查询。

答案 1 :(得分:1)

我猜你已经为此创建了自己的MVC系统,所以我不知道你将如何实现它。我使用Zend Framework,所以我可以告诉你如何使用它。

从视图中访问模型没有任何内在错误,只要它是只读访问权限,但最好从视图脚本中保留尽可能多的代码。为此,在您的情况下,我会使用view helper并且writing your own view helper在ZF中非常简单。如果你想使用这种方法,我会留给你调整你的MVC。

这意味着您可以抽象出从视图脚本中获取注释列表所需的代码,并将其替换为: -

echo $this->getComments($messageID);