2011-11-07 104 views
0

我在使用数据库查询时处理模型 - 视图 - 控制器设置时最好的编码实践是什么。我应该通过返回的查询到控制器,像这样......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; ?> 

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

+0

这与MVC设计模式没有任何关系。 –

回答

2

正如pinadelsai已经说过的,逻辑告诉把你的查询放入模型中。服务器2的目的: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_array你将有一个特性,这始终是在阵列形式($数据),无论是() ;你的视图将保持相同的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方式。

+0

谢谢!那么我应该为什么时候创建一个不同的视图来回应没有结果?这样所有的逻辑将在我的控制器? –

+0

呃,不,你的看法看起来不错;我会更新我的代码,给我一分钟 –

+0

谢谢你的有用答案。快乐的编码! –

0

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

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

我希望在这里让马点清楚。

谢谢。