2012-03-06 3 views
21

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


Question 1

J'ai un modèle où plus d'un champ de base de données est liée à un autre modèle.

Table customers a 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 Country?


Question 2

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


Question 3

Quand ou pourquoi vous devez utiliser App::uses() dans un contrôleur ou d'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.

Répondre

61

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

$this->loadModel('SomeModel'); 

Ensuite, vous pouvez faire des appels au modèle comme vous le feriez normalement:

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

App::uses est pour le chargement paresseux des classes. Ainsi, vous pouvez toujours charger un modèle en utilisant des utilisations:

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

Mais alors vous devrez appeler différemment:

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

ou

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

Cela dépend où et comment vous vouloir l'utiliser.

+5

je tente de charger un modèle à partir d'un comportement, à la fois à l'intérieur du même plug-in. Dans ce cas, vous devez utiliser: 'App :: uses ('MyModelName', 'MyPluginName.Model');' dans le Behavior et 'App :: uses ('MyPluginNameAppModel', 'MyPluginName.Model');' dans le appelé fichier MyModelName. – colares

+0

Sauvé ma journée! Merci. –

+0

Qu'en est-il de l'utilisation de 'public $ uses = array ('Model1', 'Model2');' dans le contrôleur? Je voudrais savoir si '$ uses' est préféré à $ this-> loadModel()'. – JadedCore

3

La façon préférée est

$this->load('MyModel'); 

Cependant, vous pouvez également utiliser

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

gâteau supporte à la fois et vous êtes libre d'utiliser tous ceux que vous aimez.

0

Pour la question 1

Selon votre structure il y a une association entre le modèle client et le pays, je pense que nous ne avons 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 que nous ne voulons pas modèle charger explicitement

modèle de chargement est bon quand nous don « t ont une association que nous pouvons utiliser comme,

Syntaxe pour le modèle de charge est pour charge unique modèle

$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 dans tout le contrôleur, nous pouvons utiliser $ utilise la variable Pour la charge de plusieurs modèles.

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

nous pouvons accéder modèle comme,

$this->Country->find('count'); 
Questions connexes