CakePHP:在不同的控制器中使用模型

时间:2010-09-12 21:28:28

标签: php cakephp

我有一个项目的控制器/模型。所以这控制了项目模型等等。我有一个由pages_controller控制的主页。我想在主页上显示项目列表。这样做很容易:

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

我猜不是因为我得到了:

Undefined property: PagesController::$Project

请有人指导我朝着正确的方向前进,

Jonesy

3 个答案:

答案 0 :(得分:55)

您必须按变量$uses加载控制器类中的每个模型,例如:

var $uses = array('Project');

或在行动中使用方法

$this->loadModel('Project');

答案 1 :(得分:2)

在我看来,正确的方法是在当前模型中添加一个函数,该函数实例化另一个模型并返回所需的数据。

这是一个示例,它在名为Example的模型中从Project模型返回数据,并在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子句连接了2个表。)

或者如手册所说:

  

CakePHP最强大的功能之一是能够链接模型提供的关系映射。在CakePHP中,模型之间的链接通过关联来处理。   在应用程序中定义不同对象之间的关系应该是一个自然的过程。例如:在食谱数据库中,食谱可能有很多评论,评论有一个作者,作者可能有很多食谱。定义这些关系的工作方式允许您以直观和强大的方式访问数据。 (source

答案 2 :(得分:0)

对我来说,使用requestAction更合理。这样逻辑就包含在控制器中。

例如:

//在您的控制器项目中:

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

请记住,您需要在/ app / views / projects中创建dashboard.ctp。

在Page的信息中心视图(可能是/app/views/pages/dashboard.ctp)中添加:

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

这样逻辑将保留在项目的控制器中。当然你可以请求/ projects / index,但是分页的处理会更复杂。

更多关于requestAction()。但请记住,你需要仔细使用它。它可能会降低您的申请速度。