CakePHP 2.0:从模型或其控制器访问未关联的模型?
Posted
技术标签:
【中文标题】CakePHP 2.0:从模型或其控制器访问未关联的模型?【英文标题】:CakePHP 2.0 : Accessing unassociated models from a model or its controller? 【发布时间】:2012-04-11 17:20:49 【问题描述】:假设我有 Model1 并且它没有通过 hasOne 或任何其他关系与 Model2 关联。如何访问 Model2 的信息?
我尝试了以下方法:
模型/Model1.php
class Model1 extends AppModel
public function getInfo()
App::uses('Model2','Model');
$mod2_info=$this->Model2->find('all');
return $mod2_info;
//end of class
控制器/Model1sController.php
class Model1sController extends AppController
public function index()
set('info', $this->Model1->find('all'));
//end of class
查看/Model1/index.ctp
<?php var_dump($info); ?>
浏览器输出: 致命错误:调用Model/Model1.php中非对象的成员函数find()
【问题讨论】:
【参考方案1】:有the bindModel
method,它允许您创建临时关联。
当然,使用bindModel
在模型的数据库表中仍然必须有有效的外键。或者,您可以在 Model1sController 中使用 loadModel
:
$this->loadModel('Model2');
Model2 的 find 方法随即可用。 loadModel
严格来说是一种控制器方法,因此您不能在模型中使用它,并且可能不是您想要的。
最后,在 Model1 中,您可以获得一个 Model2 实例并通过执行以下操作来使用它的 find 方法:
$Model2 = ClassRegistry::init('Model2');
$Model2->find('all');
【讨论】:
【参考方案2】:有两种方法可以解决这个问题,如果你的 Controller 中的每个方法都需要使用模型,你可以使用 $uses
数组。当控制器必须依赖这些模型时使用它。
在这个例子中,ProductionController 在它的所有方法中都使用了这三个模型,所以它们被包含在$uses
中作为控制器的必要部分。
var $uses = array('DailyProdn', 'ProdnMode', 'Prod');
请注意,这会增加一些开销,因此仅当此模型是控制器的*必要部分*时才使用$uses
。否则,加载模型即席。您可以使用 $this->loadModel()
以特殊样式在方法内加载模型。
这里 ProductionController 正在加载 Plant 模型。在您尝试访问 find()
等的植物模型之前,请将其放入方法中。当您需要在几个方法中临时使用模型时,这非常有用。
$this->loadModel('Plant');
【讨论】:
【参考方案3】:在您的第一个模型之上写下:
App::uses('MyModel', 'Model');
但是你需要用不同的方式来称呼它:
$my_model = new MyModel();
$my_model->anyOtherMethod();
$my_model->read(null, '1');
More info from here
【讨论】:
以上是关于CakePHP 2.0:从模型或其控制器访问未关联的模型?的主要内容,如果未能解决你的问题,请参考以下文章