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-&gt;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-&gt;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:从模型或其控制器访问未关联的模型?的主要内容,如果未能解决你的问题,请参考以下文章

HABTM 关联未保存 - cakephp

CakePHP bindModel 工作,预设模型关联不

CakePHP 3中关于belongsToMany关联的问题

CakePHP身份验证插件身份关联

如何使用cakephp 3进行不同数据库中模型之间的关联?

cakePHP 权限使用 ACL 并检查模型上的 user_id