múltiples conexiones de bases de datos

Cómo usar múltiples conexiones de bases de datos en Laravel

Tiempo de lectura: 4 minutos
Rate this post

Hace un par de días, me asignaron la tarea de actualizar un proyecto que había sido creado con PHP, específicamente con Laravel, el objetivo era poder realizar múltiples conexiones de bases de datos en Laravel. Aquí te contaré la historia completa.

Documentación de Laravel

Para poder realizar múltiples conexiones de bases de datos en Laravel, la primer fuente de conocimientos que se me ocurrió fue revisar la documentación de Laravel, no solo para poder realizar la tarea asignada, sino para aprender un poco más del framework ya que no lo había ocupado mucho.

Para ello, me dirigí a https://laravel.com/docs/10.x y pude observar que contaba con una sección de database, en la cuál explicaban justo la tarea que se me había asignado, por lo que simplemente tuve que seguir la documentación de la sección database para poder realizar múltiples conexiones de bases de datos en Laravel.

Arquitectura de Directorios para el proyecto en Laravel

La arquitectura de archivos que cree para poder realizar las múltiples conexiones de bases de datos en Laravel, fue la siguiente:

  • Crear un Controlador que se encargará de la Lógica general de la actualización
  • Crear un Helper para las funciones a ejecutar en el Controlador.
  • Crear un Modelo para la conexión a la primera base de datos y sus funciones de manejo
  • Crear otro Modelo para la segunda conexión a las bases de datos y sus funciones de manejo
  • Crear un ruta dentro del Router para poder ejecutar el controlador.

A decir verdad, quedé sorprendido con la facilidad que Laravel provee para poder realizar las conexiones, esto simplemente es mediante el uso de la clase DB de Illuminate, pero para explicarlo mejor, veamos un ejemplo:

múltiples conexiones de bases de datos en Laravel

El primer paso para poder crear múltiples conexiones de bases de datos en Laravel, será el siguiente:

Dentro de config/database.php, podremos encontrar un array que contiene los drivers de conexión a los diferentes manejadores de bases de datos, mysql, sqlite, postgres, por mencionar algunos, lo único que debemos de hacer, es editar ese arreglo con el driver correspondiente del manejador que queramos utilizar, en mi caso, MySQL

<?php

use Illuminate\Support\Str;

return [

    /*
    |--------------------------------------------------------------------------
    | Default Database Connection Name
    |--------------------------------------------------------------------------
    |
    | Here you may specify which of the database connections below you wish
    | to use as your default connection for all database work. Of course
    | you may use many connections at once using the Database library.
    |
    */

    'default' => env('DB_CONNECTION', 'mysql'),

    /*
    |--------------------------------------------------------------------------
    | Database Connections
    |--------------------------------------------------------------------------
    |
    | Here are each of the database connections setup for your application.
    | Of course, examples of configuring each database platform that is
    | supported by Laravel is shown below to make development simple.
    |
    |
    | All database work in Laravel is done through the PHP PDO facilities
    | so make sure you have the driver for your particular database of
    | choice installed on your machine before you begin development.
    |
    */

    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('MYSQL_DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('MYSQL_DB', 'prueba'),
            'username' => env('MYSQL_USERNAME', 'prueba'),
            'password' => env('MYSQL_PASSWORD', 'prueba'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'mysql2' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('MYSQL_DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('MYSQL_DB_2', 'prueba2'),
            'username' => env('MYSQL_USERNAME', 'prueba'),
            'password' => env('MYSQL_PASSWORD', 'prueba'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Migration Repository Table
    |--------------------------------------------------------------------------
    |
    | This table keeps track of all the migrations that have already run for
    | your application. Using this information, we can determine which of
    | the migrations on disk haven't actually been run in the database.
    |
    */

    'migrations' => 'migrations',

    /*
    |--------------------------------------------------------------------------
    | Redis Databases
    |--------------------------------------------------------------------------
    |
    | Redis is an open source, fast, and advanced key-value store that also
    | provides a richer body of commands than a typical key-value system
    | such as APC or Memcached. Laravel makes it easy to dig right in.
    |
    */

    'redis' => [

        'client' => env('REDIS_CLIENT', 'phpredis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],
    ],
];
PHP

Por defecto, solo existe una conexión mysql, sin embargo, como puedes observar, puedes realizar una copia de la conexión, asignarle un nombre distinto, en este ejemplo mysql2 y cambiar los datos de conexión, esto nos ayudará a poder crear múltiples conexiones de bases de datos en Laravel.

Observa que por defecto, revisa si existen las variables de entorno correspondientes y en caso de no ser así, ejecuta el valor por defecto que se encuentra como segundo parámetro para poder realizar las múltiples conexiones de bases de datos en Laravel

Después de haber editado el archivo database.php que se encuentra dentro del directorio de config, lo siguiente será crear la conexión a la primer base de datos, para ello, en un archivo de PHP, podríamos hacer algo como esto:

<?php
namespace APP\Clases;
use Illuminate\Support\Facades\DB;

class Conexion{
  protected $conn;
  protected $conn2;
  
  public function __construct(){
    $this->conn = DB::connection('mysql');
    $this->conn = DB::connection('mysql2');
  }
}
PHP

Con el código anterior, estamos suponiendo que estamos creando una clase Conexión y que utiliza la clase DB de Illuminate, y en su constructor, crea la nueva conexión usando el método connection de la clase DB y pasando como parámetro el nombre de la conexión que configuramos en el archivo database.php.

Así mismo, podemos observar que nos conectamos a la segunda base de datos, simplemente reemplazando el nombre de la primera conexión por la segunda y con esto ya podemos realizar múltiples conexiones de bases de datos en Laravel.

En resumen, para poder crear múltiples conexiones de bases de datos con Laravel, simplemente necesitamos configurar los drivers de conexión y después crear una instancia de la clase o clases que permitirán la ejecución de dichas conexiones, mediante el método connection de la clase DB.

Quieres aprender sobre MySQL, aquí te dejo una serie de publicaciones.

Si te ha gustado este artículo y te aporta valor te pido me sigas en mi:

🖥️ Youtube: https://www.youtube.com/@eightdev?sub_confirmation=1

🎵 Tik Tok: https://www.tiktok.com/@8devmx

✅ Facebook: https://www.facebook.com/8devmx/

📸 Instagram: https://www.instagram.com/8devmx/

También podría interesarte

Social Share Buttons and Icons powered by Ultimatelysocial
YouTube
YouTube
Instagram
Scroll al inicio