我可以在CakePHP的不同模型中使用一个模型吗?

我可以在一个模型中使用另一个模型吗?

例如。

<?php class Form extends AppModel { var $name='Form'; var $helpers=array('Html','Ajax','Javascript','Form'); var $components = array( 'RequestHandler','Email'); function saveFormName($data) { $this->data['Form']['formname']=$data['Form']['formname']; $this->saveField('name',$this->data['Form']['formname']); } function saveFieldname($data) { $this->data['Attribute']['fieldname']=$data['Attribute']['fieldname']; } } ?> 

老线程,但我要去参加,因为我相信答案是不完整的,缺乏“为什么”。 CakePHP有三种方法来加载模型。 虽然只有两种方法可以在Controller之外工作,但我会提到所有三种方法。 我不确定版本的可用性,但这是核心的东西,所以我相信他们会工作。

App::import()只能find和require()这个文件,你需要实例化这个类来使用它。 你可以告诉import()类的types,名字和文件path的细节。

ClassRegistry::init()加载文件,将实例添加到对象映射并返回实例。 这是更好的方式来加载的东西,因为它设置“蛋糕”的东西,如果你通过正常手段加载类会发生的事情。 你也可以为我觉得有用的类名设置一个别名。

Controller::loadModel()使用ClassRegistry::init()以及将Model添加为控制器的属性。 它还允许$persistModel模型caching未来的请求。 这只适用于控制器,如果这是你的情况,我会使用这种方法之前的其他人。

您可以使用这两种方法之一在任何模型/控制器内创build其他模型的实例。

如果您使用Cake 1.2:

 App::import('model','Attribute'); $attr = new Attribute(); $attr->save($dataYouWantToSavetoAttribute); 

如果您使用Cake 1.1:

 loadModel('Attribute'); $attr = new Attribute(); $attr->save($dataYouWantToSavetoAttribute); 

每个人都忽略的一个显而易见的解决scheme是在适当的情况下在两个模型之间build立关联 您可以使用它来从另一个模型中引用一个模型。

 class Creation extends AppModel { public $belongsTo = array( 'Inventor' => array( 'className' => 'Inventor', 'foreignKey' => 'inventor_id', ) ); public function whoIsMyMaker() { $this->Inventor->id = $this->field('inventor_id'); return $this->Inventor->field('name'); } } 

在CakePHP 1.2中,最好使用:

 ClassRegistry::init('Attribute')->save($data); 

这将会简单

 <?php class Form extends AppModel { //... $another_model = ClassRegistry::init('AnotherModel'); //... } ?> 

如果要在Model_A中使用Model_B,请在Model_A文件的开头添加以下行:

 App::uses('Model_B_ClassName', 'Model'); 

然后您将能够在Model_A内使用它。 例如:

 $Model_B = new Model_B_ClassName(); $result = $Model_B->findById($some_id); 

在CakePHP 3中,我们可以使用TableRegistry :: get(modelName)

 use Cake\ORM\TableRegistry; $itemsOb = TableRegistry::get('Items'); $items = $itemsOb->find("all"); debug($items); 
 var $uses = array('ModeloneName','ModeltwoName'); 

通过使用$uses属性,可以在控制器中使用多个模型,而不是使用loadModel('Model Name')

 App::import('model','Attribute'); 

是将一个模型用于其他模型的方法。 最好的方法将是使用关联。