web-dev-qa-db-fra.com

Meilleure façon de charger des modèles dans CakePHP 2.0

Je ne suis pas sûr de la meilleure façon de charger des modèles dans CakePHP 2.0 maintenant.


Question 1

J'ai un modèle dans lequel plusieurs champs de base de données sont liés à un autre modèle.

customers table contient les champs country_Origin, country_residence et country_study et tous ces champs contiennent un ID de la table countries.

Donc, dans mon modèle Client, comment dois-je charger le modèle Pays?


Question 2

Controller::loadModel() a-t-il été déprécié ou est-ce une mauvaise pratique de l'utiliser? Comment dois-je charger un modèle dans le contrôleur?


Question

Quand ou pourquoi devez-vous utiliser App::uses() dans un contrôleur ou un modèle? Je ne comprends pas le moment où les modèles se chargeront de toute façon si vous utilisez les méthodes normales comme loadModel(), hasOne, hasMany, belongsTo, etc. .

23
BadHorsie

Cela devrait être simple à comprendre. Si vous utilisez un contrôleur et que vous devez charger un autre modèle, vous pouvez appeler:

$this->loadModel('SomeModel');

Ensuite, vous pouvez appeler le modèle comme vous le feriez normalement:

$this->SomeModel->read(null, '1');

App::uses est pour le chargement paresseux des classes. Vous pouvez donc toujours charger un modèle en utilisant uses:

App::uses('MyModel', 'Model');

Mais alors vous devrez l'appeler différemment:

$MyModel = new MyModel();
$MyModel->read(null, '1');

ou

MyModel::read(null, '1');

Cela dépend simplement de l'endroit et de la façon dont vous souhaitez l'utiliser.

62
Chuck Burgess

La manière préférée est

$this->load('MyModel');

Cependant, vous pouvez également utiliser

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

Cake prend en charge les deux et vous êtes libre d'utiliser toute personne que vous aimez.

3
ayudh_das

Pour la question 1

Selon votre structure, il existe une association entre le modèle client et le modèle pays, je pense que nous n'avons donc pas besoin de charger le modèle. Nous pouvons créer une association virtuelle pour chaque identifiant tel que,

 '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' => ''
)

En faisant cela, nous pouvons créer une association entre les modèles afin que nous ne voulons pas charger le modèle explicitement

Le modèle de chargement est bon lorsque nous n'avons pas d'association pour laquelle nous pouvons utiliser comme,

La syntaxe du modèle de charge est pour une charge de modèle unique

$this->loadModel('Country');

Cela sera plus utile si nous voulons charger le modèle pour une action ou une condition particulière

Si nous voulons utiliser tout au long du contrôleur, nous pouvons utiliser $ uses variable For multiple model load.

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

nous pouvons accéder à un modèle comme,

$this->Country->find('count');
0
Harshal Shinde