web-dev-qa-db-fra.com

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'];
    }

}
?>
56
useranon

Vieux fil mais je vais sonner car je pense que les réponses sont incomplètes et manquent de "pourquoi". CakePHP a trois façons de charger des modèles. Bien que seules deux méthodes fonctionnent en dehors d'un contrôleur, je mentionnerai les trois. Je ne suis pas sûr de la disponibilité de la version, mais ce sont des choses essentielles, donc je pense qu'elles fonctionneront.

App::import() ne trouve et require() que le fichier et vous devrez instancier la classe pour l'utiliser. Vous pouvez indiquer à import() le type de classe, le nom et les détails du chemin d'accès au fichier.

ClassRegistry::init() charge le fichier, ajoute l'instance à la carte des objets et renvoie l'instance. C'est le meilleur moyen de charger quelque chose car il configure des choses "Cake" comme cela se produirait si vous chargiez la classe par des moyens normaux. Vous pouvez également définir un alias pour le nom de classe que j'ai trouvé utile.

Controller::loadModel() utilise ClassRegistry::init() et ajoute le modèle comme propriété de le controlle. Il permet également $persistModel pour la mise en cache du modèle sur les demandes futures. Cela ne fonctionne que dans un contrôleur et, si c'est votre cas, j'utiliserais cette méthode avant les autres.

119
JCotton

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);
26
inkedmn

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');
    }
}
15
Brad Koch

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

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

Cela fera simplement

<?php
   class Form extends AppModel
    {
       //...
          $another_model = ClassRegistry::init('AnotherModel');
       //...  
    }
?>
4
Mohd. Umar

Dans CakePHP 3, nous pouvons utiliser TableRegistry :: get (modelName)

use Cake\ORM\TableRegistry;

$itemsOb = TableRegistry::get('Items');
$items = $itemsOb->find("all");
debug($items);
2
tarikul05

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);
1
Zbigniew Ledwoń