{"id":93,"date":"2015-11-08T23:20:10","date_gmt":"2015-11-08T22:20:10","guid":{"rendered":"http:\/\/lab.fawno.com\/?p=93"},"modified":"2022-03-07T01:24:30","modified_gmt":"2022-03-07T00:24:30","slug":"","status":"publish","type":"post","link":"https:\/\/lab.fawno.com\/en\/2015\/11\/08\/modelos-dinamicos-en-cakephp-una-mejor-forma-de-hacerlo\/","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

Como buen enredador que soy no me quedaba conforme con la anterior soluci\u00f3n al problema de los modelos din\u00e1micos<\/a>. Si bien funcionaba muy bien el tener que declararlos mediante un<\/p>\n\n\n\n

App:uses('ModeloDinamicoModel', 'Model');<\/pre>\n\n\n\n

en lugar del habitual<\/p>\n\n\n\n

public $uses = ['ModeloDinamico'];<\/pre>\n\n\n\n

me molestaba, tambi\u00e9n hab\u00eda otras cosas, como que se sal\u00eda bastante de la definici\u00f3n habitual de los modelos cuando quer\u00edas relacionar entre si dos tablas.<\/p>\n\n\n\n

As\u00ed que investigando por ah\u00ed (v\u00eda Google y stackoverflow, no voy a mentir) he llegado a una soluci\u00f3n mucho m\u00e1s elegante y que es mucho m\u00e1s clara de entender.<\/p>\n\n\n\n

Todo la magia se basa en modificar el AppModel para incluir un nuevo m\u00e9todo:<\/p>\n\n\n\n

<?php\n  App::uses('Model', 'Model');\n\n  class AppModel extends Model {\n    public function setDbConfig ($dbconfig) {\n      if (is_array($dbconfig)) {\n        ConnectionManager::create($dbconfig['name'], $dbconfig);\n        $dbconfig = $dbconfig['name'];\n      }\n      $this->useDbConfig = $dbconfig;\n      if (is_array($this->hasMany)) foreach ($this->hasMany as $name => $table) $this->$name->useDbConfig = $dbconfig;\n      if (is_array($this->belongsTo)) foreach ($this->belongsTo as $name => $table) $this->$name->useDbConfig = $dbconfig;\n      if (is_array($this->hasAndBelongsToMany)) foreach ($this->hasAndBelongsToMany as $name => $table) $this->$name->useDbConfig = $dbconfig;\n      $this->cacheQueries = false;\n    }\n  }<\/pre>\n\n\n\n

El nuevo m\u00e9todo es el setDbConfig<\/em>, como par\u00e1metro obligatorio admite un nombre de conexi\u00f3n de base de datos de la configuraci\u00f3n (\/Config\/database.php) o bien un array con los par\u00e1metros de una nueva configuraci\u00f3n. Despu\u00e9s de configurar la conexi\u00f3n de la base de datos revisa si se ha definido alguna relaci\u00f3n hasMany<\/em>, belongsTo<\/em> o hasAndBelongsToMany<\/em> y en ese caso define la base de datos para esas relaciones.<\/p>\n\n\n\n

As\u00ed pues el modelo que defin\u00eda en el anterior post queda de la siguiente manera:<\/p>\n\n\n\n

<?php\n  class EjemploUno extends AppModel {\n    public $useDbConfig = 'default';\n    public $useTable = 'uno';\n    public $primaryKey = 'clave';\n    public $name = 'uno';\n    public $hasMany = [\n      'EjemploDos' => [\n        'foreignKey' => 'clave',\n        'associationForeignKey' => 'claveuno',\n      ],\n    ];\n  }<\/pre>\n\n\n\n

En este caso este es el modelo \"EjemploUno\" y tiene una relaci\u00f3n hasMany con \"EjemploDos\":<\/p>\n\n\n\n

<?php\n  class EjemploDos extends AppModel {\n    public $useDbConfig = 'default';\n    public $useTable = 'dos';\n    public $primaryKey = 'clavedos';\n    public $name = 'dos';\n    public $belongsTo = [\n      'EjemploUno' => [\n        'foreignKey' => 'claveuno',\n        'associationForeignKey' => 'clave',\n      ],\n    ];\n  }<\/pre>\n\n\n\n

Ahora definimos todos los modelos, tambi\u00e9n de las tablas relacionadas, y seguimos todas las reglas de CakePHP. Lo \u00fanico especial es que si las nomenclaturas de las claves y las reglas de los nombres no se cumplen hay que decirle a CakePHP qu\u00e9 claves son las que establecen la relaci\u00f3n, lo que es normal si estamos atacando unas tablas de una base de datos que no funciona bajo CakePHP.<\/p>\n\n\n\n

En el controlador lo usar\u00edamos como casi cualquier modelo normal:<\/p>\n\n\n\n

<?php\n  class EjemplosController extends AppController {\n    public $uses = ['EjemploUno', 'EjemploDos'];\n\n    public index () {\n      $this->EjemploUno->setDbConfig($databaseconfig);\n      $this->find('all');\n    }\n  }<\/pre>\n\n\n\n

Lo \u00fanico diferente es el uso de setDbConfig<\/em> antes de atacar al modelo con un find<\/em> (o lo que toque). Si el $useDbConfig<\/em> de la definici\u00f3n de los modelos ya tiene una base v\u00e1lida para ellos entonces no necesitar\u00edamos utilizar el setDbConfig<\/em>, y lo tendr\u00edamos ah\u00ed simplemente como forma de cambio de base de datos en caliente.<\/p>\n\n\n\n

Lo que he podido ver durante estos d\u00edas es que hay muchas posibilidades con los modelos din\u00e1micos, yo solo me he centrado en la definici\u00f3n al vuelo de la base de datos con la que trabaja el modelo, pero eso s\u00f3lo es una de las muchas caras que tiene este mundo tan din\u00e1mico.<\/p>\n","_es_post_name":"modelos-dinamicos-en-cakephp-una-mejor-forma-de-hacerlo","_es_post_excerpt":"","_es_post_title":"Modelos din\u00e1micos en CakePHP, una mejor forma de hacerlo","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"en","footnotes":""},"categories":[15,3],"tags":[17,6],"class_list":["post-93","post","type-post","status-publish","format-standard","hentry","category-cakephp","category-tips","tag-cakephp","tag-php"],"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\/93","targetHints":{"allow":["GET"]}}],"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=93"}],"version-history":[{"count":12,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/93\/revisions"}],"predecessor-version":[{"id":1854,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/posts\/93\/revisions\/1854"}],"wp:attachment":[{"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/media?parent=93"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/categories?post=93"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lab.fawno.com\/en\/wp-json\/wp\/v2\/tags?post=93"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}