Как я могу вызвать из модели функцию, присутствующую в другой модели? Я бы не хотел повторять код.
CakePHP: вызов других функций модели
Ответ 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;
}
}