我可以在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');
是将一个模型用于其他模型的方法。 最好的方法将是使用关联。