php - multiples - laravel 5 multiple databases
¿Es posible realizar la migración en una conexión de base de datos dinámica con Laravel 5? (5)
Estoy tratando de crear dinámicamente la base de datos para diferentes usuarios. (cada usuario tendrá su propio servidor de base de datos, por lo tanto, no pregunte por qué no estoy usando una única base de datos para todos los usuarios). Para hacerlo, tengo una base de datos predeterminada que almacena toda la información de conexión. Voy a necesitar:
- Cree una nueva base de datos y ejecute todos los archivos de migración en el nuevo registro de usuario.
- Ejecute nuevos archivos de migración en toda la base de datos registrada en esta base de datos predeterminada cuando haya actualización en el esquema.
¿Hay alguna manera de establecer dinámicamente la conexión de la base de datos del archivo de migración en función de la información que tengo en la base de datos predeterminada?
PD Para "configurar dinámicamente la conexión de la base de datos", NO me refiero a la configuración normal como lo hace en el controlador o la clase. Espero algo que al menos cree una tabla de migración en la base de datos de destino y sea capaz de autodetectar qué archivo de migración ejecutar.
Aquí tengo alguna pista sobre cómo puedes hacer esto:
1 . Habrá una base de datos global en la que mantendrá todos los datos de inicio de sesión de los usuarios, ¿verdad?
2 . Agregue un campo adicional para el nombre de la base de datos.
3 . cuando el usuario inicia sesión con éxito completo, almacena sus detalles de la base de datos en la variable de sesión.
Ahora,
4 . Cree una dinámica de archivo de base de datos y proporcione el nombre de la base de datos de esa variable de sesión como:
config(["database.connections.$new_connection" => [
// fill with dynamic data:
"driver" => "mysql",
"host" => "",
"port" => "",
"database" => "",//Here you need to set value of session variable
"username" => "",// credential will be the same for all
"password" => "",// credential will be the same for all
"charset" => "utf8",
"collation" => "utf8_unicode_ci",
"prefix" => "",
"strict" => true,
"engine" => null
]]);
Bingo, ahora estás listo para ir: D
Definir conexión en app / config / database.php
<?php
return array(
''default'' => ''mysql'',
''connections'' => array(
# Our primary database connection
''mysql'' => array(
..........
),
# Our secondary database connection
''mysql2'' => array(
.......
),
),
);?>
En migración
Schema::connection(''mysql2'')->create(''some_table'', function($table)
{
$table->increments(''id''):
});
Hola poca ayuda para ti,
en primer lugar agregue ''% new_connection%'' en el archivo database.php para manejar una nueva conexión para usarla en el futuro.
Para crear una conexión de forma dinámica, supongamos que tiene una ruta con la variable $ name para el nombre de la base de datos.
paso 1: en routes.file Creé y llamé en tu url de ruta deseada en routes.php
function appendNewConnection($name){
$path = base_path(''config'' . DIRECTORY_SEPARATOR . ''database.php'');
$contents = file_get_contents($path);
$updatedContents = str_replace(''%new_connection%'', $name . ''/' => [
/'driver/' => /'mysql/',
/'host/' => /'127.0.0.1/',
/'database/' => /''' . $name . ''/',
/'username/' => /'root/',
/'password/' => /'/',
/'charset/' => /'utf8/',
/'collation/' => /'utf8_unicode_ci/',
/'prefix/' => /'/',
/'strict/' => false,
],
/'%new_connection%'', $contents);
file_put_contents($path, $updatedContents);
}
Paso 2:
//to generate migration add below line in top of routes.php
use Illuminate/Support/Facades/Artisan;
add this line in function created above
Artisan::call(''migrate'', [''--database'' => $name]);
Primero necesitas crear la base de datos
DB::getConnection()->statement(''CREATE DATABASE :schema'', array(''schema'' => $schemaName));
A continuación, cambie el nombre de la base de datos sobre la marcha como este
$config = app(/Illuminate/Config/Repository::class);
$config->set(''database.connections.mysql.database'', UserRepotory::getCurrentDatabase());
Puede incluir Config
esta manera o a través del contenedor de servicios de laravel.
Y finalmente llamas a Artisan::call(''migrate'')
Sí lo es. Primero necesita agregar los detalles de conexión a la configuración. Una vez que haya configurado una conexión con nombre, simplemente llame al comando migrate
en la fachada de Artisan, seleccionando el nombre de la conexión ("nuevo" en este ejemplo) como opción:
use Illuminate/Support/Facades/Artisan;
//...
$new_connection = ''new'';
config(["database.connections.$new_connection" => [
// fill with dynamic data:
"driver" => "mysql",
"host" => "",
"port" => "",
"database" => "",
"username" => "",
"password" => "",
"charset" => "utf8",
"collation" => "utf8_unicode_ci",
"prefix" => "",
"strict" => true,
"engine" => null
]]);
Artisan::call(''migrate'', [''--database'' => $new_connection]);