Codeigniter将查询或生成的查询数组传递给控制器

时间:2011-11-07 05:07:28

标签: php mysql codeigniter

在使用数据库查询时处理模型 - 视图 - 控制器设置时,我想知道什么是最佳编码实践。我应该将返回的查询传递给控制器​​,如此......

控制器

$query = $this->db->get();
$this->template->write_view('content', 'work/index', array('work_query' => $query));
$this->template->render();

查看

<?php if ($work_query->num_rows() == 0): ?>
    <p>There are no works</p>
<?php else: ?>
    <?php foreach($work_query->result() as $work): ?>
        //Do something
    <?php endforeach; ?>
<?php endif; ?>

或者我应该从查询类中调用某个函数(例如result_array())并将其传递给视图。

控制器

$query = $this->db->get()->result_array();
$this->template->write_view('content', 'work/index', array('works' => $query));
$this->template->render();

查看

<?php if (empty($works)): ?>
    <p>There are no works</p>
<?php else: ?>
    <?php foreach($works as $work): ?>
        //Do something
    <?php endforeach; ?>
<?php endif; ?>

一个被认为是更好的编码标准吗?一个比另一个更有效吗?

2 个答案:

答案 0 :(得分:2)

正如pinadelsai已经说过的那样,逻辑告诉您将查询放入模型中。服务器有两个目的:1)通过分离三个逻辑bheind MVC来保持更严格和更好的编码实践; 2)保持代码的有序性,并且在您想要对查询进行一些更改的那一天更容易保持代码。
看起来你只是在一个单一的视图中调用查询,但是如果你多次调用它,并且你决定有一天更改它会怎样?您需要检查所有视图并在每个视图中进行更改;通过将逻辑保留在模型中,您只需更改一个方法,并立即将更正后的结果提供给所有视图。

一个小小的补充和一条建议:你不一定要调用数组返回函数来获得数组形式的结果。做一些事情(在您的模型中):

$query = $this->db->get('mytable'); // this is your fetching;
$data = array();
foreach($query->result() as $row)
{
  $data[] = $row;
}
return $data;

无论您是否选择使用result()并稍后将其更改为result_array(),您将拥有一个始终采用数组形式($ data)的属性;您的视图将保持相同的foreach逻辑,您只需要更改调用值的方式(使用数组表示法或对象表示法)。


<强>更新

根据您的评论,您可以在没有结果的情况下使用不同的视图(但这很大程度上取决于您的设计。更常见的是,您让模型通过其数据传递结果金额的信息。例如:

 $query = $this->db->get('mytable'); // this is your fetching;
    $data = array();
    if($query->num_rows() > 0)
    {
      foreach($query->result() as $row)
      {
        $data[] = $row;
      }
    }
    return $data;

在这种情况下,$data以空数组开头。如果返回行,则填充数组,否则返回为空。然后,在您的视图中(或者在我们的控制器中,如果您需要加载一个完整的不同视图),如何通过像在代码中那样区分这种情况来决定。


除此之外,没有强制要求的强制执行法。您可以在视图中放置所需的任何逻辑,但CI仍然可以正常工作。严格分离业务逻辑,数据操作和数据显示只是确保您的应用程序在未来更加可管理;即使你是唯一一个维护代码的人,我很确定从现在起六个月,当你回到包含查询的那些视图时,你会诅咒自己没有做过“正确”的MVC方式。

答案 1 :(得分:0)

最好不要在视图中传递查询。 MVC架构的空闲实践和核心概念是分离Controller(逻辑) - 模型(Code Behind / Data Manipulation) - View(模板)。

建议将数组中的完整结果集传递给视图。您可以通过查询来查看罕见/特定情况。 [例如,在这种情况下,您需要页脚中的一些数据在视图中调用模型查询,这样您就不必在控制器的每个函数中渲染模型查询并将其传递给视图。]

我希望,在这里我明确指出。

感谢。