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

Dee*_*yal 5 php model-view-controller cakephp cakephp-3.0

如果我真的使用了MVC方法,那么查询应该在模型中,对于CakePHP,查询应该在表类中,但是当我浏览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-在控制器中保持业务逻辑而不是模型

这不仅与Cake在示例中显示的内容或某些开发人员的意见有关,而且在处理数据库查询时真正应该是在Cake中进行编码的真正方法是什么。我发现几乎90%的人只在Controller中为Cake执行与查询相关的任务,因为他们引用“ Cake在示例中提及的内容相同”。但是关于MVC方式,我们创建表类只是为了提及关联呢?如果Cake自己的网站做到了,那么就意味着他们有意做到了。

bik*_*ilz 3

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

例如:-

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

如果您想获得任何控制器中的总活跃产品,您可以这样做,

$this->Categories->Products->totalActiveProduct();  //Total procuct in category controller
$this->Products->totalActiveProduct();   //Total products in Product controller.
Run Code Online (Sandbox Code Playgroud)

实际上,当您在控制器中编写查询时,您必须使用模型的对象(这意味着您间接地使用控制器)。您认为您正在将其写入控制器中,但实际上,您正在将其写入模型(模型对象)中。

$this->Products->find('all');
Run Code Online (Sandbox Code Playgroud)

简而言之,这意味着您正在将其写入模型对象中(其中 Products 是模型对象)。您直接或间接地通过模型进行每一个数据库操作。

  • 没有什么令人困惑的@Deepanshu,你必须明白一件事,在MVC结构中我们总是使用模型来连接到我们的数据库。如果您在控制器中编写查询,则意味着您正在写入模型的对象,并且在模型中写入时也是如此(您正在通过保存模型实例的对象 $this 进行访问)。 (3认同)
  • 确实如此,我也是这么感觉的。但是 Cake 的教程呢,这就是令人困惑的地方,因为在他们的教程中没有看到查询在模型中的位置,而是所有示例都显示了控制器中的代码。如果他们自己的网站声明了这样的内容,那么就说明他们是故意这样做的 (2认同)
  • 如果做得正确的话,通过模型方法重用代码是很棒的。我参与的许多项目迫使我复制获取逻辑,因为现有方法过于具体且通常命名不当(例如,您尝试使用“Order::getPendingOrders()”并发现它也在按客户类型进行过滤)。 (2认同)