CakePHP:控制器或模型中的查询?

时间:2017-07-07 09:30:42

标签: php cakephp model-view-controller cakephp-3.0

如果我真的经历了MVC方法,那么查询应该在Model中,在CakePHP情况下是Table Classes,但是当我查看Cake提供的教程和文档时,他们只是声明查询应该在Controller中

正如您在Cake网站上的示例中所见:https://book.cakephp.org/3.0/en/tutorials-and-examples/blog/part-two.html

但是,如果我通过此链接或我遇到的其他许多链接,查询部分应该在模型中:https://www.toptal.com/cakephp/most-common-cakephp-mistakes#common-mistake-3-keeping-business-logic-in-controllers-instead-of-models

不仅仅是关于Cake在示例中显示的内容还是开发人员的意见,而是在处理数据库查询时,应该在Cake中编写代码的真正方式。我发现只有90%的人在控制器中只为Cake执行查询相关的任务,因为他们引用了“Cake在他们的例子中提到的相同”。但是对于MVC方式,我们创建表类只是为了提及那些关联呢?如果Cake自己的网站做到了这一点,那么它意味着他们故意这样做了。

1 个答案:

答案 0 :(得分:3)

在模型中使用数据库查询是一种很好的编程习惯,因为稍后可以通过使用模型对象调用方法来重用这些查询(在另一个控制器中)。但是,您也可以在Controller中编写查询。

例如: -

//Consider this code block is in Products Model
function totalActiveProduct(){
   $totalProduct=$this->find('all', ['conditions'=>['is_active'=>'Y']]);
return $totalProduct;
}

如果您想在任何控制器中获取总活动产品,可以执行此操作,

$this->Categories->Products->totalActiveProduct();  //Total procuct in category controller
$this->Products->totalActiveProduct();   //Total products in Product controller.

实际上,当您在控制器中编写查询时,必须使用模型的对象(这意味着您间接使用控制器)。您正在考虑在控制器中编写此文件,但实际上,您正在模型中编写它(模型对象)。

$this->Products->find('all');

这意味着您在模型对象中写入此内容(其中Products是模型对象)。直接或间接地,您通过模型执行每个数据库操作。