假设我有 Model1 ,并且它与hasOne或任何其他关系没有关联到 Model2 。如何从Model2访问信息?
我尝试了以下方式:
class Model1 extends AppModel{
public function getInfo(){
App::uses('Model2','Model');
$mod2_info=$this->Model2->find('all');
return $mod2_info;
}
}//end of class
class Model1sController extends AppController{
public function index(){
set('info', $this->Model1->find('all'));
}
}//end of class
<?php var_dump($info); ?>
浏览器输出:
致命错误:在Model / Model1.php中的非对象上调用成员函数find()
答案 0 :(得分:1)
有the bindModel
method,它允许您创建临时关联。
当然,使用bindModel
时,模型的数据库表中仍然必须有有效的外键。或者,您可以在 Model1sController 中使用loadModel
:
$this->loadModel('Model2');
Model2 的查找方法随后可用。 loadModel
严格来说是一种控制器方法,所以你不能在模型中使用它,可能不是你想要的。
最后,在 Model1 中,您可以通过执行以下操作获取 Model2 实例并使用其find方法:
$Model2 = ClassRegistry::init('Model2');
$Model2->find('all');
答案 1 :(得分:1)
有两种方法可以解决这个问题,如果Controller中的每个方法都需要使用该模型,则可以使用$uses
数组。当控制器必然依赖于这些模型时使用它。
在此示例中,ProductionController在其所有方法中使用这三个模型,因此它们在$uses
中作为控制器的必要部分包含在内。
var $uses = array('DailyProdn', 'ProdnMode', 'Prod');
请注意,这会增加一些开销,因此如果此模型是控制器*的必要部分,则仅使用$uses
。否则,加载模型ad hoc。您可以使用$this->loadModel()
以特殊样式加载方法内的模型。
这里ProductionController正在加载Plant模型。在尝试访问find()
等工厂模型之前,将其放入方法中。当您需要在几个方法中临时使用模型时,这非常有用。
$this->loadModel('Plant');
答案 2 :(得分:0)
在你的第一个模型之上写下这个:
App::uses('MyModel', 'Model');
但是你需要用不同的方式调用它:
$my_model = new MyModel();
$my_model->anyOtherMethod();
$my_model->read(null, '1');