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