我知道我们应该从控制器而不是视图调用模型,但我处于必须这样做的情况
在这里:
我有一个博客脚本,在每个用户主页中,我想为每个帖子显示 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);