Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CakePHP: Queries in Controller or Models?

If I really go through the MVC approach, then the queries should be in the Model, in CakePHP case the Table Classes, but when I go through the tutorials and documentation that Cake Provides they simply state that queries should be in the Controller.

As you can see in the example over here on Cake's websites: https://book.cakephp.org/3.0/en/tutorials-and-examples/blog/part-two.html

But if I go through this link or many other I have come across, the query part should be in the Models: https://www.toptal.com/cakephp/most-common-cakephp-mistakes#common-mistake-3-keeping-business-logic-in-controllers-instead-of-models

It is not just about what Cake displays in the examples or some developers opinion, but what should really be the genuine way to code in Cake when dealing with database queries. I have found almost 90% people doing query related tasks in Controllers only for Cake, as they quote "Cake mentions the same in their examples". But what about the MVC way, we create Table Classes just to mention the associations then? If Cake's own website does that, then somehow it means they have done it intentionally.

like image 518
Deepanshu Goyal Avatar asked Jul 07 '17 09:07

Deepanshu Goyal


1 Answers

It's a good programming practice that to use your database queries in your Model because you can reuse these queries(In another controller) later by calling the method using the object of the model. However, you can also write your queries in your Controller.

For example:-

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

If you want to get the total active product in any controller you can do this,

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

Actually, when you are writing the query in you controller, you have to use the object of your model(That means indirectly you are using your controller). You are thinking that you are writing this in your controller but actually, you are writing it in the model(Object of Model).

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

Simply this means you are writing this in your model object(Where Products is the model object). Directly or indirectly you are doing your each and every database operation through the Model.

like image 134
bikash.bilz Avatar answered Sep 30 '22 03:09

bikash.bilz