CakePHP: вызов других функций модели - PullRequest
12 голосов
/ 26 августа 2011

Как я могу вызвать из модели функцию, представленную в другой модели?Я не хотел бы повторять код.

Ответы [ 7 ]

18 голосов
/ 26 августа 2011

Мы можем использовать отношение Модель для вызова функции в другой модели. Например.

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

Если в моделях нет отношения, мы можем использовать

$this->loadModel('ModelName');

Для использования в модели. В этом случае вы можете использовать

$this->ModelName->function();

непосредственно при загрузке этой модели.

7 голосов
/ 27 августа 2011

Вы должны попытаться установить отношения между вашими моделями.Существует множество типов отношений, которые вы можете прочитать здесь ...

Если у вас есть вышеуказанные ассоциации, вы можете получить доступ к связанным моделям, используя:

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

Если ваши модели не связаны между собой, вы должны использовать:

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

Вы можете проверить мой вопрос по этому вопросу, где я получил отличные ответы

2 голосов
/ 15 июля 2013

Пользовательское приложение :: import ()

App::import('Model','OtherModel');
$attr = new OtherModel();
$attr->Othermodelfunction();
0 голосов
/ 20 января 2015

Если у вас есть модельная функция, которую вы хотите вызвать из многих моделей, лучший подход - абстрагировать любые ссылки на имя модели ($ this-> alias) и поместить функцию в AppModel. Тогда он доступен в любой из ваших моделей.

class AppModel extends Model{
    public function myFunction($options = array(){
       do some stuff with $this->alias;
    }
}
0 голосов
/ 10 июля 2014

В версиях 2.x ответ на приведенный выше синтаксис $this->Model1->Model2 не будет работать. Вызов функций из других моделей во многих случаях является задачей контроллера, а не модели. Учтите, что методы модели должны быть ограничены запросом и обновлением данных при сохранении целостности базы данных.

1-й метод: использование контроллера

Я проиллюстрирую это на примере моделей Firm и User, в то время как Firm hasMany пользователей. Этот метод рекомендуется, если вы планируете добавить дополнительные функциональные возможности контроллера, такие как установка флеш-сообщений или файлов 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);

    // ... 

    }
}

2-й метод: с использованием модели

Для этого вам понадобятся правильные ассоциации моделей. Имена таблиц должны быть users и firms условно. Следуя терминологии приведенного выше примера, ваше отношение должно быть определено в модели 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 методов модели.

0 голосов
/ 26 августа 2011

нет, вы должны использовать ClassRegistry следующим образом:

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

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

        )));

ПРИМЕЧАНИЕ: это от моего контроллера, но я почти уверен, что он работает и в модели.

0 голосов
/ 26 августа 2011
  • если существует (прямая или косвенная) связь между моделью, вы можете вызвать функцию:

  • используйте bindModel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...