55 votes

Puis-je utiliser un modèle à l'intérieur d'un modèle différent dans CakePHP?

Puis-je utiliser un autre modèle dans un modèle?

Par exemple.

 <?php
class Form extends AppModel
{
    var $name='Form';
    var $helpers=array('Html','Ajax','Javascript','Form');
    var $components = array( 'RequestHandler','Email');

    function saveFormName($data)
    {
        $this->data['Form']['formname']=$data['Form']['formname'];
        $this->saveField('name',$this->data['Form']['formname']);
    } 

    function saveFieldname($data)
    {
        $this->data['Attribute']['fieldname']=$data['Attribute']['fieldname'];
    }

}
?>
 

119voto

JCotton Points 4256

Vieux thread mais je vais carillon parce que je crois que les réponses sont incomplètes et manquent dans le "pourquoi". CakePHP a trois façons de charger des modèles. Bien que seulement deux des méthodes de travail à l'extérieur, d'un Contrôleur, je vais vous parler de tous les trois. Je ne suis pas sûr à propos de la version de la disponibilité mais ce qui est le noyau de choses donc je crois qu'ils vont travailler.

App::import() découvre, et require()s le fichier, et vous aurez besoin d'instancier la classe pour l'utiliser. Vous pouvez dire import() le type de classe, le nom et le chemin d'accès au fichier de détails.

ClassRegistry::init() charge le fichier, ajoute l'instance de l'objet carte et retourne l'instance. C'est la meilleure façon de charger quelque chose, car il met en place le "Gâteau" des choses que se passerait-il si vous avez chargé la classe par des moyens normaux. Vous pouvez également définir un alias pour le nom de la classe que j'ai trouvé utile.

Controller::loadModel() utilise ClassRegistry::init() ainsi que ajoute le Modèle en tant que propriété du contrôleur. Il permet également d' $persistModel pour le modèle de mise en cache sur les demandes futures. Cela ne fonctionne que dans un Contrôleur, et, si c'est votre situation, je voudrais utiliser cette méthode avant les autres.

26voto

inkedmn Points 12655

Vous pouvez créer des instances d'autres modèles à partir de n'importe quel modèle / contrôleur à l'aide de l'une de ces deux méthodes.

Si vous utilisez Cake 1.2:

 App::import('model','Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);
 

Si vous utilisez Cake 1.1:

 loadModel('Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);
 

15voto

Brad Koch Points 4046

Une solution évidente que tout le monde a ratée est de créer une association entre deux modèles, le cas échéant. Vous pouvez l'utiliser pour pouvoir référencer un modèle de l'intérieur d'un autre.

 class Creation extends AppModel {
    public $belongsTo = array(
        'Inventor' => array(
            'className'  => 'Inventor',
            'foreignKey'  => 'inventor_id',
        )
    );

    public function whoIsMyMaker() {
        $this->Inventor->id = $this->field('inventor_id');
        return $this->Inventor->field('name');
    }
}
 

11voto

michas Points 99

Dans CakePHP 1.2, il est préférable d'utiliser:

 ClassRegistry::init('Attribute')->save($data);
 

1voto

Si vous souhaitez utiliser Model_B dans Model_A, ajoutez cette ligne au début du fichier Model_A:

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

et vous pourrez ensuite l'utiliser dans Model_A. Par exemple:

 $Model_B = new Model_B_ClassName();
$result = $Model_B->findById($some_id);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X