> Faqs > Inner join entre dos tablas de diferentes bases de datos - Laravel

Inner join entre dos tablas de diferentes bases de datos - Laravel

Cómo podria hacer un inner join entre dos tablas, las cuales se encuentran en diferentes bases de datos, por lo que tengo dos conexiones.

Pero no se como consolidar dichas conexiones para realizar una consulta que obtenga data de ambas

Este es el 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);

Respuestas

Si se trata de un mismo servidor de MySQL es posible que se pueda hacer con un código como el que sugieren en esta respuesta de Stack Overflow.

Incluso hay una persona que comenta esto: si tienes defindas en tu modelo las conexiones a las bases de datos que usa cada uno, aún siendo diferentes bases de datos, solamente tienes que definir las relaciones normales entre modelos.

Cuando dice definidas las distintas conexiones a las bases de datos se refiere a poner en el modelo:

protected $connection = 'mysql2';

Revisa si te funciona y nos cuentas cómo te ha ido.

Si las tablas que pretendes relacionar están en servidores de MySQL distintos

Si se tratan de motores de base de datos distintos, es decir, cada una de la conexiones es un servidor de MySQL distinto, dudo que se pueda hacer. En ese caso yo creo que no vas a poder hacer el join sobre tablas de dos bases de datos disntinas alojadas en instalaciones de MySQL separadas, al menos la misma consulta de Eloquent.

Podrías hacerlo si aplicas algo de programación.

Idea 1:

Podrías btener los datos de tablas de las distintas conexiones de manera separada, con consultas de query builder independientes. Ahora bien, si los datos de una consulta necesitan filtrar, por ejemplo, para quedarse los ID otra consulta en la otra conexión, entonces tendrás que sacar los ID de una vez y luego, teniendo esos ID en un array montar la consulta en el segundo motor.

Luego, con los resultados de ambos motores de bases de datos, las conexiones diferentes, deberías hacer mediante programación y/o uso de los métodos de colección de Laravel, componer el resultado final que quieres obtener.

Idea 2:

Otra posibilidad que se me ocurre es que pases los datos que pretendes relacionar hacia el otro motor de la base de datos antes de montar el join. Me explico, tienes en el motor A) unos datos y en el motor B) otros. Pues haces una copia de las tablas del motor A) en el motor B) (o viceversa, lo que sea menos costoso, el caso es tenerlos juntos) y luego ejecutas la consulta con tu join que afecta solo a un motor de base de datos.

Solo como conclusión: La idea 1 podría darte más trabajo a la hora de programarlo. La idea 2 la programación puede ser más sencilla, pero el trasiego de datos más costoso en términos de procesamiento.

Miguel Angel
3320 147 216 17