Adquiere por un año todos los cursos, escuelas y certificados por un precio especial.

Adquiere por un año todos los cursos, escuelas y certificados por un precio especial.

Antes:$249

Currency
$219/año
Paga en 4 cuotas sin intereses
Paga en 4 cuotas sin intereses
Comprar ahora

Termina en:

01d

04h

22m

27s

3

Conectar a n (varias) Bases de Datos con Laravel

Hace días me encontré con tremendo problema, quería conectarme a apróximadamente 500 bases de datos (ese número irá creciendo) por lo que me no podía establecer en el archivo de entorno .env o en la configuración todas las conexiones para todas esas bases de datos, no es lo más optimo tampoco es mantenible. Por lo que la solución que encontré fue la siguiente:

<?phpclassResetBDD{

	publicfunctionsetBDD(){

	$configDb = [
			'driver'      => 'mysql',
			'host'        => env('DB_HOST', '127.0.0.1'),
			'port'        => env('DB_PORT', '3306'),
			'database'    => 'BDD',
			'username'    => env('DB_USERNAME', 'forge'),
			'password'    => env('DB_PASSWORD', ''),
			'unix_socket' => env('DB_SOCKET', ''),
			'charset'     => 'utf8',
			'collation'   => 'utf8_unicode_ci',
			'prefix'      => '',
			'strict'      => true,
			'engine'      => null,
    ];

    \Config::set('database.connections.DB_Serverr', $configDb);

    $conexionSQL = \DB::connection('DB_Serverr');

    $datos = $conexionSQL->select('select campos FROM tabla');

	}

}

Dicho código lo podríamos mejorar y setear los parámetros para poder conectar a cualquier base de datos.

Escribe tu comentario
+ 2
1
3992Puntos

¿Podrías por favor explicar un poco más el cómo funciona tu solución a la conexión de base de datos con Laravel?

1
3 años

Mi solución fué.

<?phpnamespaceApp\Http\Controllers\Configurations;

useApp\Http\Controllers\Controller;
useIlluminate\Support\Facades\Config;
useIlluminate\Support\Facades\DB;

classResetBDDextendsController{
    public $request;
    publicfunction__construct( $request ){
        $this->request = $request;
    }
    publicfunctionsetBDD(){
        $configDb = [
            'driver'    => 'sqlsrv',
            'host'      => env('DB_HOST', $this->request['DB_HOST']),
            'port'      => env('DB_HOST', $this->request['DB_PORT']),
            'database'  => env('DB_HOST', $this->request['DB_DATABASE']),
            'username'  => env('DB_HOST', $this->request['DB_USERNAME']),
            'password'  => env('DB_HOST', $this->request['DB_PASSWORD']),
        ];

        /*> config/database.php
          // Database Connections
          'connections' => [
            'mi_conexion' => [
                'driver' => 'sqlsrv',
                ...
            ]
         ]*/
        $CONFIG = 'database.connections.'.$this->request['NAME_CONNECTION'];
        Config::set($CONFIG,$configDb);
        return DB::connection($this->request['NAME_CONNECTION']);
    }
}

Mi controlador

    public function dbConection(Request $request){

        $validacion = Validator::make($request->all(), [
            'NAME_CONNECTION' => 'required',
            'DB_HOST' => 'required',
            'DB_PORT' => 'required',
            'DB_DATABASE' => 'required',
            'DB_USERNAME' => 'required',
            'DB_PASSWORD' => 'required'
        ]);

        if ($validacion->fails()) {
            return response()->json([
                'error'=>$validacion->errors()
            ], 200);
        }

        $input = $request->all();

        $environment =  new ResetBDD( $input );
        $connection  = $environment->setBDD();

        return $connection->table('Users')
            ->select('*')
            ->get();
    }
1
719Puntos
un año

Gracias por vuestros aportes. Una duda que me genera, aunque se pueda generar el objeto $connection, este solo es válido para un request dentro del mismo proceso, ¿correcto? Es decir, si después de hacer un $connection->table()… hiciera un redirect a hacia otra vista, volvería a tomar el valor por defecto designado en el .env

1
4271Puntos

Hola también me parece interesante las solución ya que tengo que trabajar de forma similar podrías detallar un poco más como lo solucionaste… Gracias