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


alternative for calling a model from view in this situation

我知道我们应该从控制器而不是视图调用模型,但我处于必须这样做的情况

在这里:

我有一个博客脚本,在每个用户主页中,我想为每个帖子显示 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;
  //////

}

我现在这不能像这样工作,因为我必须使用助手或库或在模型中使用静态方法来执行此操作(我正在使用代码点火器,其他框架工作可能会有所不同)

但是我有什么选择呢?

我可以在控制器中做到这一点,在获取帖子后使用 foreach 循环并获取每个帖子评论,将所有评论放在 2d 数组中($c_array[post_id][it's comments array]

将它们发送到带有帖子的视图,并在每个帖子的视图中查看数组以获取其评论和......。

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

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

并且在两个查询中选择也有不同的限制我对 mvc 相当陌生。在这种情况下,正确的方法是什么?

通常,

您会在post模型上找到一种方法来获取该帖子的评论。 此外,我通常会有一种方法来确保将评论加入到帖子中,这样您就不会为每个帖子发出评论查询。

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

从视图访问模型本身并没有什么问题,只要它是只读访问,但最好将尽可能多的代码排除在视图脚本之外。为此,在您的情况下,我会使用视图助手,并且在 ZF 中编写您自己的视图助手非常简单。如果您希望使用此方法,我将留给您将其适应您的 MVC。

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

echo $this->getComments($messageID);