CakePHP: использование моделей в разных контроллерах

У меня есть контроллер/модель для проектов. так что это управляет моделью проектов и т.д. и т.д. У меня есть домашняя страница, которая контролируется page_controller. Я хочу показать список проектов на главной странице. Это так же просто:

function index() {
    $this->set('projects', $this->Project->find('all'));        
}

Я предполагаю, что не получаю:

Undefined property: PagesController::$Project

Может кто-то направить меня в правильном направлении, пожалуйста,

Джоунси

Ответы

Ответ 1

Вы должны загрузить каждую модель в классе контроллера переменной $uses, например:

var $uses = array('Project');

или при использовании метода действий

$this->loadModel('Project');

Ответ 2

На мой взгляд, правильный способ сделать это - добавить функцию к вашей текущей модели, которая создает экземпляр другой модели и возвращает необходимые данные.

Здесь приведен пример, который возвращает данные из модели Project в модели под названием Example и вызывает данные в контроллере Example:

Использование модели проекта внутри модели примера:

<?php
/* Example Model */
App::uses('Project', 'Model');
class Example extends AppModel {

    public function allProjects() {
        $projectModel = new Project();
        $projects = $projectModel->find('all');
        return $projects;
    }

}

Возврат этих данных в примерном контроллере

// once inside your correct view function just do:
$projects = $this->Example->allProjects();
$this->set('projects', $projects);

В представлении "Пример"

<?php
// Now assuming you're in the .ctp template associated with
// your view function which used: $projects = $this->Example->allProjects();
// you should be able to access the var: $projects
// For example:
print_r($projects['Project']);

Почему эта "лучшая" практика, чем загрузка обеих моделей в ваш контроллер? Ну, модель проекта наследуется моделью примера, поэтому данные проекта теперь становятся частью области примера. (То, что это означает на стороне базы данных вещей, состоит в том, что две таблицы объединены с помощью предложений SQL JOIN).

Или как говорится в руководстве:

Одной из самых мощных функций CakePHP является возможность связать реляционное сопоставление, предоставляемое моделью. В CakePHP связи между моделями обрабатываются через ассоциации. Определение отношений между различными объектами в вашем приложении должно быть естественным процессом. Например: в базе данных рецептов рецепт может иметь много обзоров, обзоры имеют одного автора, и у авторов может быть много рецептов. Определение того, как работают эти отношения, позволяет вам получить доступ к вашим данным интуитивным и мощным способом. (источник)

Ответ 3

Для меня более разумно использовать requestAction. Таким образом, логика завершается в контроллер.

В примере:

//в вашем контроллере Проекты:

class ProjectsController extends AppController {
  function dashboard(){
    $this->set('projects', $this->Project->find('all'));
  }
  $this->render('dashboard');
}

Помните, что вам нужно создать dashboard.ctp в /app/views/projects, конечно.

В представлении панели инструментов страницы (возможно,/app/views/pages/dashboard.ctp) добавьте:

echo $this->requestAction(array('controller'=>'projects', 'action'=>'dashboard'));

Таким образом, логика останется в контроллере проекта. Конечно, вы можете запросить/проекты/индекс, но обработка разбиения на страницы будет сложнее.

подробнее requestAction(). но имейте в виду, что вам нужно использовать его осторожно. Это может замедлить ваше приложение.