由于其他答案(like this),我只是想澄清 CakePHP 1.3 中应该使用的内容。
具体来说,我有一种情况需要一个模型依赖于另一个,所以从该模型中的方法我想加载另一个,用信息做一些事情等。
documentation for the App Class说:
在以前的版本中,根据您要加载的类的类型,有不同的函数来加载所需的类。这些函数已被弃用,所有类和库加载都应该通过App :: import()来完成。
我假设这涵盖ClassRegistry
等的使用,但我只想明确,并确定:
我应该使用App::import('Model', ...)
从另一个模型中使用一个模型吗?如果别的什么,什么?
答案 0 :(得分:13)
看来,即使是引用文档,即使是自2008年以来的两年,最好的方法是使用ClassRegistry::init()
。
这在特定类/方法的实际API /文档中很明显。
根据$ name或要搜索的特定文件查找类。调用App :: import()不会构造文件中包含的任何类。它只会找到并要求()文件。
加载一个类,在注册表中注册该对象并返回该对象的实例。
示例简单使用:获取Post模型实例ClassRegistry :: init('Post');
正如您所看到的,即使API文档也指出了使用ClassRegistry
加载模型,为您实例化它们的示例,而不是App::import
(更少),尽管已更改CakePHP“Book”文档中的措辞。
答案 1 :(得分:7)
如果您可以关联模型,那么最好的方法是使用
动态绑定关系 $this->bindModel("hasOne" => array("Model2"))
。
如果您无法关联模型并且只想在一次出现时使用第二个模型,那么您可以使用
ClassRegistry::init('Model2')->find('allThatIWant');
如果您想多次使用它,那么您必须尝试
$this->model2 = & ClassRegistry::init('Model2')
$this->model2->find('allThatIWant');
答案 2 :(得分:2)
从2.6.x开始,它仍然是ClassRegistry :: init()。
存在重大差异。 App :: import只包含/要求它。另一方面,ClassRegistry::init()将实例化它并获取模型的完全加载对象。
所以说,例如,你在AppController的beforeFilter中加载了一个模型。您可以使用 $ this-> Model-> __ something 为其添加一些自定义属性。现在你可以在没有$ controller对象的地方调用ClassRegistry :: init(' Model'),例如,在一个行为中。 ClassRegistry :: init(' Model')返回的对象将具有您的自定义属性 $ this-> Model-> __ something 。
顺便说一下, $ controller-> loadModel()似乎是加载模型的理想方式,在这里您可以使用$ controller对象,例如在您的组件中。
答案 3 :(得分:-2)
$this->loadModel('model name')
会做,然后只需在模型中定义关系,例如hasone,belongssto ......并调用$this->model->model2
。