Language:

Search

Migración de Sistemas en Laravel: Conexión y Consultas entre Bases de Datos

  • Share this:
Migración de Sistemas en Laravel: Conexión y Consultas entre Bases de Datos

La modernización de sistemas antiguos es una tarea desafiante para muchas empresas, especialmente cuando los sistemas actuales están en producción y son fundamentales para las operaciones diarias. Este post aborda una estrategia para actualizar un sistema legacy (incluso si está hecho con un framework) utilizando Laravel, enfocándose en la conexión a múltiples bases de datos y la realización de consultas cruzadas entre ellas.


Contexto

En el mundo real es común encontrar sistemas críticos en producción que fueron desarrollados sin seguir buenas prácticas de programación y con una base de datos mal estructurada. Nombres de campos inconsistentes, convenciones irregulares y una falta general de organización pueden dificultar la evolución y mantenimiento del sistema. Ante esta situación, muchas empresas optan por comenzar un nuevo proyecto, migrando módulo por módulo hacia una arquitectura moderna y bien diseñada.

Conexión a Bases de Datos Múltiples

Para facilitar la transición y mantener la funcionalidad del sistema durante el desarrollo del nuevo, Laravel permite conectarse tanto a la base de datos nueva como a la antigua.

 


Configuración de Múltiples Conexiones de Base de Datos

En el archivo config/database.php, se puede añadir una configuración para la base de datos antigua:

'mysql_second_connection' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST_SECOND', ''),
    'database'  => env('DB_DATABASE_SECOND', ''),
    'username'  => env('DB_USERNAME_SECOND', ''),
    'password'  => env('DB_PASSWORD_SECOND', ''),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
],

Luego, en el archivo .env, se definen las variables necesarias:

DB_HOST_SECOND=your_old_database_host
DB_DATABASE_SECOND=your_old_database_name
DB_USERNAME_SECOND=your_old_database_user
DB_PASSWORD_SECOND=your_old_database_password

Modelos para la Base de Datos Antigua

Para los modelos que necesiten acceder a la base de datos antigua, se debe especificar la conexión a usar:

class UserOld extends Authenticatable
{
    protected $table = 'users';
    protected $connection = 'mysql_second_connection';
}

 

Consultas Cruzadas entre Bases de Datos con Eloquent

Laravel facilita la ejecución de consultas cruzadas utilizando las relaciones de Eloquent. Aquí te muestro un ejemplo práctico:


Definir los Modelos

Se definen los modelos User y Order, especificando las conexiones correspondientes.

namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
    protected $connection = 'mysql_first_connection';
    protected $table = 'users';
}
class Order extends Model
{
    protected $connection = 'mysql_second_connection';
    protected $table = 'orders';
    public function user()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }
}

Para este ejemplo, supongamos que el modelo User hace referencia a la tabla users así como es posible especificar las propiedades $connection y $table, se pueden omitir, lo cual quiere decir que Laravel entenderá que es para la conexión local (del nuevo proyecto en desarrollo, y no de la segunda conexión creada). 


Realizar Consultas Cruzadas con Eloquent

Para este ejemplo, partiendo de la premisa que las Orders se encuentran en la tabla orders, de la base de datos antigua, y los users, en la base de datos nueva, si queremos obtener todos los pedidos y el nombre del usuario que realizó cada pedido podemos hacer algo como esto: 

use App\Models\Order;
$orders = Order::with(['user' => function($query) {
    $query->select('id', 'name'); // Seleccionar solo los campos necesarios
}])->get();
foreach ($orders as $order) {
    echo "Order ID: {$order->id}, User Name: {$order->user->name}\n";
}

 


Creación de Migraciones con Llaves Foráneas hacia la Base de Datos Antigua

Es posible crear migraciones en la nueva base de datos y establecer relaciones con tablas en la base de datos antigua. 
 

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
class CreateNewTableWithForeignKey extends Migration
{
    public function up()
    {
        Schema::create('new_table', function (Blueprint $table) {
            $database = DB::connection('mysql_second_connection')->getDatabaseName();
            $table->id();
            $table->unsignedBigInteger('old_user_id')->nullable();
            $table->foreign('old_user_id')->references('id')->on($database . '.old_users');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('new_table');
    }
}

 


Conclusión

Migrar y modernizar un sistema legacy es un proceso complejo que requiere una planificación cuidadosa y la implementación de soluciones pragmáticas. La configuración de múltiples conexiones de base de datos y la capacidad de realizar consultas cruzadas en Laravel son herramientas poderosas que facilitan esta transición. Aunque cada proyecto tiene sus particularidades, esta guía pretende ofrecer uno de tantos enfoques que existen y que puede ser adaptado a diversas situaciones.

Si tienes alguna pregunta o comentario, no dudes en compartirlo. ¡Estamos aquí para ayudar!


Colaboración imagen: Javier Luppi

Carlos Santiago

Carlos Santiago

Laravel Developer