CakePHP: использование моделей в разных контроллерах - PullRequest
14 голосов
/ 13 сентября 2010

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

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

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

Undefined property: PagesController::$Project

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

Джоунси

Ответы [ 3 ]

57 голосов
/ 13 сентября 2010

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

var $uses = array('Project');

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

$this->loadModel('Project');
2 голосов
/ 09 июня 2015

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

Вот пример, который возвращает данные из модели проекта в модели с именем 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']);

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

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

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

0 голосов
/ 13 сентября 2010

Для меня разумнее использовать 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'));

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...