Лучший способ загрузки моделей в CakePHP 2.0
Я не уверен, что теперь лучше всего загружать модели в CakePHP 2.0.
Вопрос 1
У меня есть модель, где несколько полей базы данных связаны с другой моделью.
customers
таблица имеет поля country_origin
, country_residence
и country_study
, и все эти поля содержат идентификатор из таблицы countries
.
Итак, в моей модели Customer, как я должен загружать модель Country?
Вопрос 2
Неужели Controller::loadModel()
устарел или это плохая практика, чтобы использовать это? Как я могу загрузить модель в контроллер?
Вопрос 3
Когда или почему вы должны использовать App::uses()
в контроллере или модели? Я не понимаю, когда модели будут загружаться в любом случае, если вы используете обычные методы, такие как loadModel()
, hasOne
, hasMany
, belongsTo
и т.д.
Ответы
Ответ 1
Это должно быть просто понять. Если вы используете контроллер и вам нужно загрузить другую модель, вы можете позвонить:
$this->loadModel('SomeModel');
Затем вы можете делать вызовы модели, как обычно:
$this->SomeModel->read(null, '1');
App::uses
предназначен для ленивой загрузки классов. Таким образом, вы можете загрузить модель с использованием:
App::uses('MyModel', 'Model');
Но тогда вам нужно будет называть его по-другому:
$MyModel = new MyModel();
$MyModel->read(null, '1');
или
MyModel::read(null, '1');
Это зависит только от того, где и как вы хотите его использовать.
Ответ 2
Предпочтительным способом является
$this->load('MyModel');
Однако вы также можете использовать
public $uses = array('DefaultModel', 'MyModel');
.
.
$this->MyModel->field(...);
Cake поддерживает оба варианта, и вы можете использовать любого, кто вам нравится.
Ответ 3
В вопросе 1
В соответствии с вашей структурой существует связь между моделью клиента и страны, я думаю, нам не нужно загружать модель.
Мы можем создать виртуальную ассоциацию для каждого идентификатора, например,
'CountryOrigin' => array(
'className' => 'Country',
'foreignKey' => 'country_origin_id',
'dependent' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
'CountryResidence' => array(
'className' => 'Country',
'foreignKey' => 'country_residence_id',
'dependent' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
Посредством этого мы можем создать связь между моделями, поэтому мы не хотим явно загружать модель
Загрузка модели хороша, если у нас нет ассоциации, которую мы можем использовать как
Синтаксис для модели загрузки
Для загрузки одной модели
$this->loadModel('Country');
Это будет более полезно, если мы хотим загрузить модель для конкретного действия или условия
Если мы хотим использовать весь контроллер, мы можем использовать переменную $uses
Для загрузки нескольких моделей.
public $uses = array('Country','OtherModel');
мы можем получить доступ к модели, например,
$this->Country->find('count');