{"id":73,"date":"2015-10-27T22:30:58","date_gmt":"2015-10-27T21:30:58","guid":{"rendered":"http:\/\/lab.fawno.com\/?p=73"},"modified":"2022-03-07T01:14:32","modified_gmt":"2022-03-07T00:14:32","slug":"","status":"publish","type":"post","link":"https:\/\/lab.fawno.com\/en\/2015\/10\/27\/modelos-dinamicos-en-cakephp\/","title":{"rendered":"","raw":""},"content":{"rendered":"","protected":false,"raw":""},"excerpt":{"rendered":"","protected":false,"raw":""},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_typography_data":[],"_editorskit_blocks_typography":"","_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_es_post_content":"\n

\u00daltimamente estoy experimentando mucho con CakePHP<\/a> y una de las cosas que he necesitado es crear unos modelos en los que pudiera cambiar en tiempo de ejecuci\u00f3n la base de datos con la que est\u00e1n enlazados.<\/p>\n\n\n\n

B\u00e1sicamente estoy construyendo un portal en el que se aglutinan una serie de utilidades, y alguna de estas utilidades atacan a otras bases de datos independientes de portal.<\/p>\n\n\n\n

Lo que se me ha ocurrido es crear en la base de datos del portal una tabla en la que almaceno la configuraci\u00f3n de las bases de datos a las que quiero acceder (algunas de ellas comparten modelo). De esta manera puedo crear de manera din\u00e1mica las conexiones necesarias y enlazarlas con los modelos que necesite en ese momento.<\/p>\n\n\n\n

La tabla es la siguiente:<\/p>\n\n\n\n

CREATE TABLE databases (\n  id int(11) unsigned NOT NULL AUTO_INCREMENT, \n  name varchar(20) NOT NULL DEFAULT '', \n  datasource varchar(255) NOT NULL DEFAULT 'Database\/Mysql', \n  persistent tinyint(1) DEFAULT NULL, \n  host varchar(255) DEFAULT NULL, \n  login varchar(255) DEFAULT NULL, \n  password varchar(255) DEFAULT NULL, \n  database varchar(255) DEFAULT NULL, \n  prefix varchar(255) DEFAULT NULL, \n  encoding varchar(255) NOT NULL DEFAULT 'utf8', \n  PRIMARY KEY (id), \n  UNIQUE KEY name_UNIQUE (name) \n) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;<\/pre>\n\n\n\n

Y este ser\u00eda uno de los modelos:<\/p>\n\n\n\n

<?php\n  App::uses('Model', 'Model');\n  App::uses('ConnectionManager', 'Model');\n\n  class EjemploUnoModel extends Model {\n    public $useDbConfig = 'default';\n    public $useTable = 'uno';\n    public $primaryKey = 'clave';\n    public $name = 'uno';\n    public $hasMany = [\n      'dos' => [\n        'foreignKey' => 'clave',\n        'associationForeignKey' => 'claveuno',\n      ],\n    ];\n\n    public function __construct($id = false, $table = null, $ds = null) {\n      if (isset($id['Database'])) {\n        ConnectionManager::create($id['Database']['name'], $id['Database']);\n        $this->useDbConfig = $id['Database']['name'];\n        $id = false;\n      }\n\n      $this->dos->useDbConfig = $this->useDbConfig;\n      $this->dos->useTable = 'dos';\n      $this->dos->primaryKey = 'clavedos';\n      $this->dos->name = 'dos';\n\n      parent::__construct();\n    }\n  }<\/pre>\n\n\n\n

El ejemplo tiene tambi\u00e9n un enlace con otra tabla, en este caso llamada \"dos\". En la documentaci\u00f3n del CakePHP<\/a> se explica que foreingKey es el campo de la tabla \"uno\" que realiza en enlace, y el associationForeignKey es el campo de la tabla \"dos\". Para definir las propiedades relativas a la tabla \"dos\", como el origen de datos (useDbConfig) lo hacemos en el constructor.<\/p>\n\n\n\n

Y as\u00ed es c\u00f3mo lo utilizo:<\/p>\n\n\n\n

App::uses('EjemploUnoModel', 'Model');\n$database['Database'] = $this->Database->find('first', ['conditions' => ['name' => 'baseuno'], 'recursive' => -1]);\n$uno = new EjemploUnoModel($database);\n$lista = $uno->find('list', ['fields' => ['nombre'], 'recursive' => -1]);<\/pre>\n\n\n\n

El ejemplo hace una cosa un poco extra\u00f1a<\/p>\n\n\n\n

$database['Database'] = ...<\/pre>\n\n\n\n

esto es porque al ser un ejemplo he simplificado el esquema real de trabajo ya que tengo una tabla donde guardo los sistemas a los que voy a acceder y que est\u00e1 enlazada con la tabla databases <\/em>que es donde se guardan las conexiones de las bases de datos... pero creo que se entiende.<\/p>\n","_es_post_name":"modelos-dinamicos-en-cakephp","_es_post_excerpt":"","_es_post_title":"Modelos din\u00e1micos en CakePHP","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"en","footnotes":""},"categories":[15,3],"tags":[17,6],"ninja_gutenberg_blocks_featured_media_urls":{"thumbnail":"","ninja_gutenberg_blocks_landscape_large":"","ninja_gutenberg_blocks_portrait_large":"","ninja_gutenberg_blocks_square_large":"","ninja_gutenberg_blocks_landscape":"","ninja_gutenberg_blocks_portrait":"","ninja_gutenberg_blocks_square":"","full":""},"_links":{"self":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/73"}],"collection":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/comments?post=73"}],"version-history":[{"count":12,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/73\/revisions"}],"predecessor-version":[{"id":1852,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/73\/revisions\/1852"}],"wp:attachment":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/media?parent=73"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/categories?post=73"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/tags?post=73"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}