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

Php Codeigniter将查询或生成的查询数组传递给控制器,php,mysql,codeigniter,Php,Mysql,Codeigniter,在使用数据库查询时,在处理模型-视图-控制器设置时,我想知道什么是最佳编码实践。我是否应该将返回的查询传递给控制器,就像这样 控制器 $query = $this->db->get(); $this->template->write_view('content', 'work/index', array('work_query' => $query)); $this->template->render(); $query = $this->db-

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

控制器

$query = $this->db->get();
$this->template->write_view('content', 'work/index', array('work_query' => $query));
$this->template->render();
$query = $this->db->get()->result_array();
$this->template->write_view('content', 'work/index', array('works' => $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; ?>
<?php if (empty($works)): ?>
    <p>There are no works</p>
<?php else: ?>
    <?php foreach($works as $work): ?>
        //Do something
    <?php endforeach; ?>
<?php endif; ?>
查看

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

没有作品

//做点什么

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

最好不要在视图中传递查询。MVC架构的闲置实践和核心概念是分离控制器(逻辑)-模型(代码隐藏/数据操作)-视图(模板)

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

我希望,我在这里把我的观点讲清楚了


谢谢。

正如pinadelsai已经说过的那样,逻辑告诉我们将查询放入模型中。这有两个目的:1)通过分离MVC中的三个逻辑来保持更严格和更好的编码实践;2) 让您的代码井然有序,以便在您希望在查询中进行某些更改的那一天进行维护
看起来您只是在单个rendred视图中调用查询,但是如果您多次调用它,并且您决定有一天更改它,会怎么样?您需要检查所有视图,并对每个视图进行更改;通过将逻辑保留在模型中,只需更改一个方法,即可将更正后的结果一次提供给所有视图

一个小的补充和一条建议:您不必调用数组返回函数来获得数组形式的结果。执行以下操作(在您的模型中):

无论您选择使用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方式。

谢谢!那么,当我没有得到结果时,我是否应该创建一个不同的视图?这样所有的逻辑都将在我的控制器中?好吧,不,你的视图看起来不错;我会更新我的代码,给我几分钟的时间告诉你有用的答案。愉快的编码!这些都与MVC设计模式没有任何关系。