cakephp: как использовать операторы find в моделях вместо контроллера - PullRequest
3 голосов
/ 22 ноября 2011

Я читал о понятии "толстая модель и тощий контроллер". Я, конечно, хотел бы следовать этой концепции.

Прямо сейчас все мои контроллеры толстые, а мои модели худые. У меня есть много запросов на поиск в контроллерах, которые я хотел бы перенести на модели. Но я понятия не имею, как это сделать.

В какую функцию модели я должен поместить оператор поиска? и после установки stmts в модели я смогу автоматически просматривать эти данные в соответствующем представлении?

Может кто-нибудь привести пример? Я уже прошел образец блога поваренной книги cakephp. И в этом месте stmts find находятся в контроллере, а не в модели. Модель содержит только отношения и проверки. Мне еще предстоит увидеть пример модели, содержащий команду stmts.

Ответы [ 3 ]

14 голосов
/ 22 ноября 2011

Ответы, которые были даны, отвечают на часть вашего вопроса. Вы можете использовать метод find без объявления класса Model (поэтому $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;
    }
  }
?>

Обратите внимание, что вы не можете использовать $this->set() в своей модели, вы должны использовать его в своем контроллере:

ProductsController.php:

<?php
  class ProductsController extends AppController {
    //Components, helpers, etc. go here

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

Заполненная переменная $products (если в соответствующей таблице базы данных есть записи) теперь будет доступна в вашем представлении.

Это отличная статья , в которой подробно описываются концепции Cake, а в Кулинарной книге есть еще одна статья MVC в целом .

2 голосов
/ 22 ноября 2011

В вашей модели может быть что-то подобное

function getProductGroups($company_id){

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

*, таким образом вы также можете использовать оператор find для других контроллеров.

0 голосов
/ 22 ноября 2011

Чтобы использовать поиск в модели, вы можете просто написать:

//in User model
$this->find('first', array('recursive' => '-1', 'conditions' => array('User.id' => $userId), 'fields' => $this->authFields));

Надеюсь, это поможет

...