> Faqs > ¿Cómo usar dos bases de datos MySQL distintas en Laravel?

¿Cómo usar dos bases de datos MySQL distintas en Laravel?

¿Cuál es la mejor alternativa para gestionar dos bases de datos MySQL distintas, en una aplicación Laravel?

Generalmente queremos conectar con la base de datos MySQL principal, pero ocasionalmente queremos recuperar información de otra base de datos que está en el mismo servidor. ¿Cómo lo haríamos para tener conexiones a múltiples bases de datos?

Respuestas

Esto es supersencillo de realizar con Laravel... más aún para el caso que tú necesitas que tienes que acceder a la vez a una base de datos MySQL distinta, que reside en el mismo servidor.

Configurar la conexión con la segunda base de datos

Las conexiones en Laravel se configuran en el archivo "config/database.php". Allí tendrás una base de datos MySQL ya creada, en el array "connections":

 'connections' => [

    'mysql' => [
        'driver' => 'mysql',
        ...
    ],

Pues ahora tendrás que agregar una segunda conexión, a la que le podrás llamar como desees. Teóricamente esa segunda conexión puede tener cualquier dato de un nuevo servidor al que pudieras conectarte... no hay restricciones en cuanto a usar otros servidores. Pero en tu caso usarás los mismos datos de conexión al servidor que para tu base de datos principal. Por lo que solamente cambiarás el nombre de la base de datos y ocasionalmente el usuario y la clave de esa segunda base de datos, si es que cambia con respecto a la anterior...

 'connections' => [

    'mysql' => [
        'driver' => 'mysql',
        ...
    ],
    
    'mysql2' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => 'otra_base_de_datos',
        ...
    ],

Realizar conexiones con la base de datos "mysql2"

Fíjate que en el array de connections tenemos "mysql" que es la conexión principal con MySQL y "mysql2" que sería la conexión secundaria que quieres usar solo ocasionalmente.

La solución más simple sería usar query builder para esa conexión ocasional, lo que te ahorraría create modelos específicos para las entidades de la segunda base de datos.

$invoices = DB::connection('mysql2')->table('invoices')->get();

Como ves, estamos indicando que la conexión es "mysql2".

La segunda alternativa aquí sería crearte modelos específicos que usen la segunda conexión con MySQL, lo que te puede facilitar las cosas en caso que las operaciones sean más complejas y tengas que manejar relaciones y cosas así.

Para establecer la conexión en la clase del modelo, se usa la propiedad $connection, a la que le asignarías el valor de tu segunda conexión en el array de connections.

class Invoice extends Eloquent {

    protected $connection = 'mysql2';

    // ... resto del modelo
}
Julian
1100 46 84 45

Puedo tener 2 tablas llamadas users, una en cada base de datos?.

Eduardo
0
En principio sí que podrías. A los modelos los tendrás que nombrar de manera distinta, pero configurando el nombre de la conexión y la tabla creo que se podría hacer perfectamente.

Hola buen dia,

¿Alguien sabe cómo podria hacer un inner join desde tablas de diferentes conexiones de laravel?

// Codigo que tengo 

$risc_conexion = DB::connection('sqlsrv4');

$his_conexion = DB::connection('sqlsrv5');

$resultados = $risc_conexion
  ->table('risc_2030.PADRON_NOMINAL')
  ->join($his_conexion
  ->table('BDHIS_MINSA.dbo.rpt_plano_cbeta_acum'), 'risc_2030.PADRON_NOMINAL.DNI', '=', 'BDHIS_MINSA.dbo.rpt_plano_cbeta_acum.numero_documento' )
  ->select('risc_2030.PADRON_NOMINAL.*', 'BDHIS_MINSA.dbo.rpt_plano_cbeta_acum.*')
  ->first();

dd($resultados);
Jhon
2 1
Por medio de una consulta única dudo que puedas... porque siempre se va a usar la misma tabla en el query builder... nunca lo he probado, es solo una impresión. Creo que deberías hacerla a mano, por ejemplo sacar todos los índices de los elementos de una conexión y luego con esos índices montar la relación a mano con un whereIn(), por dar una idea. No sé tu caso concreto cómo lo podrías hacer.