2012-10-07 115 views
7

¿Alguien sabe cuál es la mejor práctica para usar 2 bases de datos diferentes en mi aplicación?Codeigniter: la mejor forma de usar dos bases de datos diferentes

Necesito almacenar datos en ambas bases de datos que se encuentran de forma diferente (host, nombre de usuario, contraseña, todo cambia).

tengo la intención de crear modelos, como de costumbre, y en nombre del conjunto de construcción, pasar el host db, etc.

Respuesta

16

No estoy seguro de si se llama a este "mejor" manera, pero un manera, tal como se describe en el tutorial, es esto,

en el archivo de base de datos, usted tiene la configuración por defecto, una parte del cual es:

$db['default']['hostname'] = "localhost"; 
$db['default']['username'] = "user"; 
$db['default']['password'] = "database"; 
$db['default']['database'] = "db1"; 

ahora puede crear otro grupo, digamos que llamarlo el grupo 1 y que desea que tenga todo lo mismo que la configuración de base de datos por defecto, excepto el nombre, por lo que puede hacer

$db['group1']=$db['default']; 
$db['group1']['database']="db2"; 

entonces, cuando se quiere utilizar la segunda base de datos, sólo tiene que ir

$DB2 = $this->load->database('group1', TRUE); 

y luego, en lugar de $this->db->foo(), que va a hacer $DB2->foo()

alternativamente (como se sugiere en los comentarios de acuerdo sbaaaang), se puede hacer $this->db=$DB2; para mantener todo igual

y se puede extender esto a varios grupos como éste

$DB1 = $this->load->database('group1', TRUE); 
$DB2 = $this->load->database('group2', TRUE); 
... 
$DBn = $this->load->database('groupn', TRUE); 
+1

Creo que está bien, entonces puedo configurar el grupo db a utilizar en el modelo de construcción de – sbaaaang

+3

$ this-> db = $ this-> load-> base de datos ('grupo1', VERDADERO); – sbaaaang

+1

Esto se ve bien. Pero, ¿no hay una forma simple de cambiar el nombre de la base de datos y no toda la configuración? Algo así como lo usamos en core php, 'mysql_select_db (dbname)'. Como en mi caso, solo necesito cambiar el nombre de db y todos mis dbs están en el mismo servidor. – user3526

4

Bueno me gustaría simplemente a escribir aquí mi causa solución que he usado menos código que pienso:

en database.php me puse los grupos de base de datos de modo de ejemplo:

$database['default']['dbname'] = 'db1'; 
$database['second_db']['dbname'] = 'db2'; 

entonces en modelos i utiliza el constructor para cambiar a la base de datos que desea utilizar como esto:

//use db1 
function __construct() 
    { 
     // Call the Model constructor 
     parent::__construct(); 
     $this->load->database('default',true); 
    } 
//use db2 
function __construct() 
    { 
     // Call the Model constructor 
     parent::__construct(); 
     $this->load->database('second_db',true); 
    } 

si alguien quiere mostrar más soluciones, ¡por favor! Estos son solo mis dos centavos.

+2

hay un problema, al cargar 2 modelos en los controladores, el primero cargado establece la base de datos para usar también para el segundo cargado, y también si el segundo modelo cargado tiene diferente db en __construct, entonces ... si alguien me puede ayudar a arreglar esto ¡Creo que realmente lo somos! – sbaaaang

4

leí que

$db['default']['pconnect'] = FALSE; 

debe ser falsa para que estas cosas funcionan. Por favor corrígeme si estoy equivocado. Para TODAS las bases de datos múltiples que usa, tiene que estar desactivado. No sé si esta es una buena solución.

0

intentado esto, y funciona:

$db['otherdb'] = array_merge($db['primarydb'], array(

    'database' => 'otherdbname' 

)); 
Cuestiones relacionadas