cakephp:如何在模型中而不是控制器中使用find语句

cakephp:如何在模型中而不是控制器中使用find语句,cakephp,model,find,Cakephp,Model,Find,我读到了“胖模特和瘦控制器”的概念。我当然愿意遵循这个概念 现在,我所有的控制器都很胖,我的模型都很瘦。我在控制器中有很多find stmt(查询),我想把它们转移到模型中。但是我不知道怎么做 我应该将find语句放在模型的哪个函数中?在模型中设置STMT之后,我是否能够自动在各自的视图中查看数据 谁能给我举个例子吗?我已经阅读了cakephp食谱博客示例。在那里,find stmt位于控制器中,而不是模型中。该模型仅包含关系和验证。我还没有看到包含find stmts的模型示例。您的模型上可以

我读到了“胖模特和瘦控制器”的概念。我当然愿意遵循这个概念

现在,我所有的控制器都很胖,我的模型都很瘦。我在控制器中有很多find stmt(查询),我想把它们转移到模型中。但是我不知道怎么做

我应该将find语句放在模型的哪个函数中?在模型中设置STMT之后,我是否能够自动在各自的视图中查看数据


谁能给我举个例子吗?我已经阅读了cakephp食谱博客示例。在那里,find stmt位于控制器中,而不是模型中。该模型仅包含关系和验证。我还没有看到包含find stmts的模型示例。

您的模型上可以有类似的内容

function getProductGroups($company_id){

    $product_groups = $this->find('all', 
                array('conditions' => array('ProductGroup.company_id' => $company_id) )
            );
    return $product_groups;
}   

*通过这种方式,您还可以对其他控制器使用find语句。

要在模型中使用find,您只需编写:

//in User model $this->find('first', array('recursive' => '-1', 'conditions' => array('User.id' => $userId), 'fields' => $this->authFields)); //在用户模型中 $this->find('first',array('recursive'=>'-1','conditions'=>array('User.id'=>$userId),'fields'=>$this->authFields));
希望它能帮助你回答部分问题。您可以在不使用模型类声明的情况下使用find方法(因此
$this->find()
而不是
$this->Model->find()

为了遵循“胖模型,瘦控制器”的原则,您的模型应该包含应用程序的大部分业务逻辑,而控制器处理视图使用的模型中的数据

因此,如果您想让所有
find
逻辑发生在您的模型中,您应该执行以下操作

Product.php:

<?php
  class ProductModel extends AppModel {
    //Associations, etc. go here

    function getProducts($limit=5) {
      $products = array();
      $products = $this->find('all', array('limit' => $limit));
      return $products;
    }
  }
?>
填充的
$products
变量(如果revelant数据库表中有记录)现在将在您的视图中可用


详细介绍了蛋糕的概念,食谱中还有一个关于蛋糕的概念。

mensch,非常感谢您的精彩解释和链接。我将能够通过产品模型查找获得所有相关模型数据。也就是说,如果产品有一个制造商,而产品有很多客户,我是否能够通过产品模型的查找来获取制造商和产品数据?mensch,太好了,我尝试了一个简单的测试项目,是的,我能够在视图中获取两个相关模型的数据。再次感谢你,很高兴听到你这么说!您确实可以通过将
recursive
设置为高于0的值,或者通过如下方式访问find方法来访问关联的数据:
$this->Customer->find()
<?php
  class ProductsController extends AppController {
    //Components, helpers, etc. go here

    function index() {
      $products = $this->Product->getProducts(10);
      $this->set('products', $products);
    }
  }
?>