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

Лучший способ загрузки моделей в 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 и т.д.

4b9b3361

Ответ 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');