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.
¿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?
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(); }
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
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