我可以在一个模型中使用另一个模型吗?
例如
<?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'];
}
}
?>
答案 0 :(得分:119)
旧帖子但是我要插话,因为我相信答案是不完整的,缺乏“为什么”。 CakePHP有三种加载模型的方法。虽然只有两种方法在Controller之外工作,但我会提到这三种方法。我不确定版本的可用性,但这是核心内容,所以我相信它们会起作用。
App::import()
只查找和require()
文件,您需要实例化该类才能使用它。您可以告诉import()
类的类型,名称和文件路径详细信息。
ClassRegistry::init()
加载文件,将实例添加到对象图并返回实例。这是加载某些东西的更好方法,因为它设置了“蛋糕”的东西,如果你通过正常方式加载类就会发生这种情况。您还可以为我发现有用的类名设置别名。
Controller::loadModel()
使用ClassRegistry::init()
,并将模型添加为控制器的属性。它还允许$persistModel
用于未来请求的模型缓存。这仅适用于Controller,如果是你的情况,我会先使用这种方法。
答案 1 :(得分:26)
您可以使用这两种方法之一在任何模型/控制器中创建其他模型的实例。
如果你正在使用Cake 1.2:
App::import('model','Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);
如果你正在使用Cake 1.1:
loadModel('Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);
答案 2 :(得分:15)
每个人都错过的一个明显的解决方案是在两个模型之间创建一个association,如果合适的话。您可以使用它来引用另一个模型。
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');
}
}
答案 3 :(得分:11)
在CakePHP 1.2中,最好使用:
ClassRegistry::init('Attribute')->save($data);
答案 4 :(得分:4)
This will do simply
<?php
class Form extends AppModel
{
//...
$another_model = ClassRegistry::init('AnotherModel');
//...
}
?>
答案 5 :(得分:1)
如果你想在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);
答案 6 :(得分:1)
在CakePHP 3中,我们可以使用TableRegistry::get(modelName)
use Cake\ORM\TableRegistry;
$itemsOb = TableRegistry::get('Items');
$items = $itemsOb->find("all");
debug($items);
答案 7 :(得分:-3)
var $uses = array('ModeloneName','ModeltwoName');
通过使用$uses
属性,您可以在控制器中使用多个模型,而不是使用loadModel('Model Name')
。
App::import('model','Attribute');
是将一个模型用于其他模型的方法。最好的方法是使用协会。