Trabajando con Code Igniter he llegado a un punto en el que las conexiones con la base de datos me suponen un problema. Tengo unas 4 o 5 conexiones configuradas.
El problema que tengo es el siguiente. En muchos de mis modelos me estaba conectando en el contructor del modelo. A fin de cuentas cargar un modelo significa que voy a usar la base de datos... hasta ahora.
He creado modelos "pojo" para facturas y sus líneas. Tengo un array lleno de facturas tipo "Modelo_factura" y dentro de estos una variable privada con un array de lineas tipo "Modelo_linea". Claro, si voy conectando en el constructor me puedo encontrar con 600 conexiones simultáneas.
Pero también querría hacer un $factura->guardar(); por lo que cada una de estos modelos si que deberia tener conexion. Pero la misma!
Además, si voy creando la conexion desde fuera y se la envío a los modelos veo que code igniter asocia $this->db a la última cargada, así que si tengo que mezclar varias conexiones se va sobreescribiendo el valor de $this->db y tengo que ir cambiándolo.
En fin que no veo nada claro como hacer esto bien. Quizá mis clases POJO no deberían estar en models y no deberían tener conexiones?
Además, no entiendo qué hace $this->load->model('Nombre_modelo'). Pensaba que solo "incluía" la clase, pero veo que también la instancia en $this->Nombre_modelo.
Cuanto más conozco más ignorante soy.
Mi único intento de solución fué extender CodeIgniter.php con una clase propia con $db1, $db2, $db3... y luego desde cualquier sitio usar $db1 para la db1, la 2 para la 2... pero resulta que los modelos no tienen origen en CodeIgniter.php... así que tampoco me sirvió.
¿Algún consejo para manejar estas conexiones?
Es que creo que lo lógico sería aprovechar los modelos como pojos si están bien hechos, porque sino sería duplicar la información.
Por lo pronto lo he "arreglado" así. En el fichero databases incluyo al final esta clase:
Código PHP:
Ver original
<?php { Class Conn { static $gestion; static $subversion; static $trackings; static $proveedores; static function conectarGestion($conexion) { if (!self::$gestion) self::$gestion = $conexion; } static function conectarSubversion($conexion) { if (!self::$subversion) self::$subversion = $conexion; } static function conectarTrackings($conexion) { if (!self::$trackings) self::$trackings = $conexion; } } }
Y luego para usarlo pues:
Código PHP:
Ver original
Conn::conectarGestion($dsn); $res = Conn::gestion->query("SELECT nombre FROM clientes")->result_query();
Lo veis correcto o es una burrada?
Al final me ha quedado así. Aunque sigo sin saber si estoy comiento algún error grave. Funcionar funciona eso sí.
Código PHP:
Ver original
<?php { /** * Class Conexiones * La utiliza la clase Conn * NO USAR MANUALMENTE */ Class Conexiones extends CI_Controller { public function getGestion() { return $this->load->database('gestion', TRUE); } public function getSubversion() { return $this->load->database('subversion', TRUE); } public function getTrackings() { return $this->load->database('trackings', TRUE); } public function getProveedores() { return $this->load->database('proveedores', TRUE); } } } { /** * Class Conn */ Class Conn { /** * Contiene una instancia de la clase conexiones * @var Conexiones $conexiones */ private static $conexiones; static $gestion; static $subversion; static $trackings; static $proveedores; static private function compruebaConexiones() { if (!self::$conexiones) self::$conexiones = new Conexiones(); } /** * @return void */ static function conectarGestion() { self::compruebaConexiones(); if (!self::$gestion) self::$gestion = self::$conexiones->getGestion(); } static function conectarProveedores() { self::compruebaConexiones(); if (!self::$proveedores) self::$proveedores = self::$conexiones->getProveedores(); } static function conectarSubversion() { self::compruebaConexiones(); if (!self::$subversion) self::$subversion = self::$conexiones->getSubversion(); } static function conectarTrackings() { self::compruebaConexiones(); if (!self::$trackings) self::$trackings = self::$conexiones->getTrackings(); } /** * @return mixed */ public static function getProveedores() { if (!self::$proveedores) self::conectarProveedores(); return self::$proveedores; } /** * @return mixed */ public static function getGestion() { if (!self::$proveedores) self::conectarGestion(); return self::$gestion; } /** * @return mixed */ public static function getSubversion() { if (!self::$proveedores) self::conectarSubversion(); return self::$subversion; } /** * @return mixed */ public static function getTrackings() { if (!self::$proveedores) self::conectarTrackings(); return self::$trackings; } } }
Y para utilizarlo sólo tengo que poner esto en cualquier sitio:
Conn::getGestion()->query("SELECT nombre FROM clientes")->result();
Y ya se encarga de conectar si es necesario y de devolver la conexión adecuada.
Si le sirve a alguien estupendo. Me falta hacer pruebas y ver si funciona correctamente.