13

我正在尝试为不同的用户动态创建数据库。(每个用户都有自己的数据库服务器,所以不要问我为什么不为所有用户使用单个数据库)为此,我有一个默认数据库来存储所有连接信息。我将需要:

  1. 创建一个新数据库并在新用户注册时运行所有迁移文件。
  2. 当架构中有更新时,在此默认数据库中记录的所有数据库上运行新的迁移文件。

有没有办法可以根据我在默认数据库上的信息动态设置迁移文件的数据库连接?


PS 对于“动态设置数据库连接”,我并不是指您在控制器或类中所做的正常设置。我希望至少可以在目标数据库中创建迁移表并能够自行检测要运行的迁移文件。

4

4 回答 4

13

就在这里。首先,您需要将连接详细信息添加到配置中。配置命名连接后,只需调用migrateArtisan 外观上的命令,选择连接的名称(在本例中为“新”)作为选项:

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]);
于 2016-10-18T14:00:51.140 回答
1

你好,对你的帮助不大,

首先在 database.php 文件中添加 '%new_connection%' 以处理新连接以供将来使用。

要动态创建连接,假设您有一个带有变量 $name 数据库名称的路由。

第 1 步: 在我创建的 routes.file 中,并在 routes.php 中您想要的路由 url 上调用它

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);

}

第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]);
于 2016-10-19T10:38:30.907 回答
1

首先你需要创建数据库

 DB::getConnection()->statement('CREATE DATABASE :schema', array('schema' => $schemaName)); 

然后像这样动态更改数据库的名称

$config = app(\Illuminate\Config\Repository::class);
$config->set('database.connections.mysql.database', UserRepotory::getCurrentDatabase());

你可以Config像这样包含或通过 laravel 的服务容器。

最后你打电话Artisan::call('migrate')

于 2016-10-18T18:44:56.243 回答
0

在这里,我有一些关于如何做到这一点的线索:

1 . 将有一个全局数据库,您可以在其中维护所有用户的登录详细信息,对吗?

2 . 为数据库名称添加一个额外的字段。

3 . 当用户完全成功登录时,将他们的数据库详细信息存储在会话变量中。

现在,

4 . 创建一个动态的数据库文件,并从该会话变量中给出数据库名称:

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
    ]]);

宾果游戏你现在准备好了:D

于 2016-10-24T09:03:38.877 回答