¿Puedo usar un modelo dentro de un modelo diferente en CakePHP?

¿Puedo usar otro modelo dentro de un modelo?

P.ej.

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

Viejo hilo, pero voy a tocar el timbre porque creo que las respuestas son incompletas y faltan “por qué”. CakePHP tiene tres formas de cargar modelos. Aunque solo dos métodos funcionan fuera de un Controlador, mencionaré los tres. No estoy seguro de la disponibilidad de la versión, pero esto es algo fundamental, así que creo que funcionarán.

App::import() solo busca y require() el archivo y tendrás que crear una instancia de la clase para usarlo. Puede indicar a import() el tipo de clase, el nombre y los detalles de la ruta de archivo.

ClassRegistry::init() carga el archivo, agrega la instancia al mapa del objeto y devuelve la instancia. Esta es la mejor manera de cargar algo porque configura las cosas “Cake” como sucedería si cargaras la clase por medios normales. También puede establecer un alias para el nombre de clase que he encontrado útil.

Controller::loadModel() usa ClassRegistry::init() y agrega el Modelo como una propiedad del controlador. También permite $persistModel para el modelo de caché en solicitudes futuras. Esto solo funciona en un Controlador y, si esa es su situación, usaría este método antes que los demás.

Puede crear instancias de otros modelos desde cualquier modelo / controlador usando uno de estos dos métodos.

Si estás usando Cake 1.2:

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

Si estás usando Cake 1.1:

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

Una solución obvia que todos se perdieron es crear una asociación entre dos modelos, si corresponde. Puede usarlo para poder hacer referencia a un modelo desde dentro de otro.

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

En CakePHP 1.2, es mejor usar:

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

Esto hará simplemente

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

Si desea utilizar Model_B dentro de Model_A, agregue esta línea al principio del archivo Model_A:

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

y luego podrás usarlo dentro de Model_A. Por ejemplo:

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

En CakePHP 3 podemos usar TableRegistry :: get (modelName)

 use Cake\ORM\TableRegistry; $itemsOb = TableRegistry::get('Items'); $items = $itemsOb->find("all"); debug($items); 
 var $uses = array('ModeloneName','ModeltwoName'); 

Al usar $uses propiedad, puede usar varios modelos en el controlador en lugar de usar loadModel('Model Name') .

 App::import('model','Attribute'); 

es la forma de usar un modelo en otro modelo. La mejor manera será usar la asociación.