Ответ 1
Вы должны загрузить каждую модель в классе контроллера переменной $uses
, например:
var $uses = array('Project');
или при использовании метода действий
$this->loadModel('Project');
У меня есть контроллер/модель для проектов. так что это управляет моделью проектов и т.д. и т.д. У меня есть домашняя страница, которая контролируется page_controller. Я хочу показать список проектов на главной странице. Это так же просто:
function index() {
$this->set('projects', $this->Project->find('all'));
}
Я предполагаю, что не получаю:
Undefined property: PagesController::$Project
Может кто-то направить меня в правильном направлении, пожалуйста,
Джоунси
Вы должны загрузить каждую модель в классе контроллера переменной $uses
, например:
var $uses = array('Project');
или при использовании метода действий
$this->loadModel('Project');
На мой взгляд, правильный способ сделать это - добавить функцию к вашей текущей модели, которая создает экземпляр другой модели и возвращает необходимые данные.
Здесь приведен пример, который возвращает данные из модели 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 связи между моделями обрабатываются через ассоциации. Определение отношений между различными объектами в вашем приложении должно быть естественным процессом. Например: в базе данных рецептов рецепт может иметь много обзоров, обзоры имеют одного автора, и у авторов может быть много рецептов. Определение того, как работают эти отношения, позволяет вам получить доступ к вашим данным интуитивным и мощным способом. (источник)
Для меня более разумно использовать 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(). но имейте в виду, что вам нужно использовать его осторожно. Это может замедлить ваше приложение.