CakePHP 2.0:从模型或其控制器访问非关联模型?

时间:2012-04-11 17:20:50

标签: php controller cakephp-2.0 cakephp-appmodel

假设我有 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

查看/型号1 / index.ctp

   <?php var_dump($info);   ?>

浏览器输出:
致命错误:在Model / Model1.php中的非对象上调用成员函数find()

3 个答案:

答案 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');

More info from here