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

时间:2009-06-11 11:19:05

标签: 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'];
    }

}
?>

8 个答案:

答案 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');

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