我有一个项目的控制器/模型。所以这控制了项目模型等等。我有一个由pages_controller控制的主页。我想在主页上显示项目列表。这样做很容易:
function index() {
$this->set('projects', $this->Project->find('all'));
}
我猜不是因为我得到了:
Undefined property: PagesController::$Project
请有人指导我朝着正确的方向前进,
Jonesy
答案 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()。但请记住,你需要仔细使用它。它可能会降低您的申请速度。