Search code examples
databaselaravelconfigmigrate

I can't migrate dynamically with Laravel


I am creating a database for each user who has a record. I am able to set this created database via config. But I can't migrate. The error I encountered is:

Database [5d7acdf5adf6a] not configured.

    $user=User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'database'=>uniqid()
    ]);

     Artisan::call('make:database',['dbname'=>$user->database]);
     $this->connectAnother($user->database);

     Artisan::call('migrate',['--database'=>$user->database]);
     dd(Artisan::output());
     error-->Database [5d7acdf5adf6a] not configured.

connectAnother is a method I wrote.

    public function connectAnother($database){
            \Config::set("database.connections.mysql", [
            "host" => "127.0.0.1",
            "database" => $database,
            "username" => "...",
            "password" => "..."
        ]);
    }

config/database.php:

    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        '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'),
        ]) : [],
    ],

I tried to migrate directly when I changed the database, but got the answer 'Nothing to migrate'


Solution

  • Here is the solution

     public function connect($database){
        $connection = [
            'driver' => 'mysql',
            'url' => config('database.connections.mysql.url'),
            'host' => config('database.connections.mysql.host'),
            'port' => config('database.connections.mysql.port'),
            'database' => $database,
            'username' => config('database.connections.mysql.username'),
            'password' => config('database.connections.mysql.password'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => 'InnoDB',
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ];
        \Config::set("database.connections.{$database}", $connection);
        DB::setDefaultConnection($database);->***The most important place in this line***