Подтвердить что ты не робот

CakePHP: вызов других функций модели

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

4b9b3361

Ответ 1

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

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

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

$this->loadModel('ModelName');

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

$this->ModelName->function();

так как вы загрузили эту модель.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

  • если есть прямая или косвенная связь между моделью, вы можете вызвать функцию: $this- > Model1- > Model2 → ...- > Modeln- > function();

  • использовать bindModel

Ответ 5

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

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

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

        )));

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

Ответ 6

В версиях 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);

    // ... 

    }
}

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

Для этого вам понадобятся правильные ассоциации моделей. Названия таблиц должны быть 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.

Ответ 7

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

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