Лучший способ загрузить модели в CakePHP 2.0 - PullRequest
23 голосов
/ 06 марта 2012

Я не уверен, что сейчас лучший способ загрузки моделей в CakePHP 2.0.


Вопрос 1

У меня есть модель, в которой несколько полей базы данных связаны с другой моделью.

customers таблица содержит поля country_origin, country_residence и country_study, и все эти поля содержат идентификатор из таблицы countries.

Так в моей модели Customer, как я должен загрузить модель Country?


Вопрос 2

Controller::loadModel() устарело или это плохая практика? Как мне загрузить модель в контроллер?


Вопрос 3

Когда или почему вы должны использовать App::uses() в контроллере или модели? Я не понимаю смысла, когда модели все равно будут загружаться, если вы используете обычные методы, такие как loadModel(), hasOne, hasMany, belongsTo и т. Д.

Ответы [ 3 ]

62 голосов
/ 06 марта 2012

Это должно быть просто для понимания. Если вы используете контроллер и вам нужно загрузить другую модель, вы можете позвонить:

$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');

Это зависит только от того, где и как вы хотите его использовать.

3 голосов
/ 01 июня 2013

Предпочтительным способом является

$this->load('MyModel');

Однако вы также можете использовать

public $uses = array('DefaultModel', 'MyModel');
.
.
$this->MyModel->field(...);

Cake поддерживает оба варианта, и вы можете использовать любого, кого захотите.

0 голосов
/ 19 июля 2016

для вопроса 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');

Это будет более полезно, если мы хотим загрузить модель для определенного действия или условия

Если мы хотим использовать во всем контроллере, мы можем использовать переменную $ using Для нескольких моделей загрузки.

public $uses = array('Country','OtherModel');

мы можем получить доступ к модели, как,

$this->Country->find('count');
...