CakePHP:调用其他Model函数

时间:2011-08-26 12:26:14

标签: cakephp

如何从模型中调用另一个模型中的函数?我不想重复代码。

7 个答案:

答案 0 :(得分:18)

我们可以使用Model关系在另一个模型中调用该函数。例如

$this->Model->ModelOne->find();
$this->Model->ModelOne->customFunc();

如果模型中没有关系,我们可以使用

$this->loadModel('ModelName');

在模型中使用。 在这种情况下,您可以使用

$this->ModelName->function();

直接加载该模型。

答案 1 :(得分:7)

您应该尝试在模型之间建立关系。您可以阅读许多类型的关系here ...

如果您具有上述关联,则可以使用以下方式访问相关模型:

$this->Model->OtherModel->function();

如果您的模型没有任何关联,您应该使用:

ClassRegistry::init('OtherModel')->function();

您可以在此处查看my question,我获得了很好的答案

答案 2 :(得分:2)

User App :: import()

App::import('Model','OtherModel');
$attr = new OtherModel();
$attr->Othermodelfunction();

答案 3 :(得分:0)

  • 如果模型之间存在(直接或间接)关系,则可以调用函数:$ this-> Model1-> Model2-> ...-> Modeln-> function( );

  • 使用bindModel

答案 4 :(得分:0)

不,你应该像这样使用ClassRegistry:

    //MessagesController - in my send() method...

$this->set('content', ClassRegistry::init('Content')->find('first', array(
        'conditions' => array('Content.id' => 3)

        )));

注意:这是来自我的控制器,但我很确定它也适用于模型。

答案 5 :(得分:0)

在2.x版本中,上面回答的$this->Model1->Model2语法不起作用。在许多情况下,从其他模型调用函数是控制器的工作,而不是模型。考虑到这一点,模型方法应限于查询和更新数据,同时保持数据库的完整性。

第一种方法:使用控制器

我将使用FirmUser模型的示例来说明这一点,而Firm hasMany个用户。如果您计划在中间添加额外的控制器功能,建议使用此方法,例如设置Flash消息或cookie。

User型号:

public function saveRegisteredUsers($user_data,$firm_id){ ... }

-

FirmsController

public function add(){
    if($this->Firm->save($this->request->data)){

    // set $this->Firm->id here 

    $this->loadModel('User');
    $this->User->saveRegisteredUsers($this->request->data['User'], 
      $this->Firm->id);

    // ... 

    }
}

第二种方法:使用模型

为此,您需要具有正确的模型关联。表名必须是usersfirms。按照上述示例的术语,您的关系应在Firm模型中定义为:

public $hasMany = array( 'User' => array(
    'className' => 'User',
));

User模型中,您必须正确设置belongsTo关联:

public $belongsTo = array(
    'Firm' => array(
        'className' => 'Firm',
        'foreignKey' => 'firm_id',
        'dependent' => false
        )
    );

在此之后,您可以直接从任何$this->User->saveRegisteredUsers()模型方法中调用Firm

答案 6 :(得分:0)

如果您想要从许多模型调用模型函数,最好的方法是抽象对模型名称的引用($ this-> alias)并将函数放在AppModel中。然后可以在任何模型中访问它。

class AppModel extends Model{
    public function myFunction($options = array(){
       do some stuff with $this->alias;
    }
}