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