CakePHP 2.0 :从模型或其控制器访问未关联的模型


CakePHP 2.0 : Accessing unassociated models from a model or its controller?

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

更多信息来自这里