Php 是否可以使用Laravel 5在动态数据库连接上进行迁移?

Php 是否可以使用Laravel 5在动态数据库连接上进行迁移?,php,laravel,laravel-5,database-migration,laravel-migrations,Php,Laravel,Laravel 5,Database Migration,Laravel Migrations,我正在尝试为不同的用户动态创建数据库。(每个用户都有自己的数据库服务器,所以不要问我为什么不为所有用户使用单个数据库)为此,我有一个默认数据库存储所有连接信息。我需要: 创建新数据库并在新用户注册时运行所有迁移文件 当架构中有更新时,在此默认数据库中记录的所有数据库上运行新迁移文件 是否有一种方法可以根据默认数据库上的信息动态设置迁移文件的数据库连接 另外,对于“动态设置数据库连接”,我指的不是控制器或类中的正常设置。我希望至少能够在目标数据库中创建迁移表,并能够自我检测要运行的迁移文件。是的

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

  • 创建新数据库并在新用户注册时运行所有迁移文件
  • 当架构中有更新时,在此默认数据库中记录的所有数据库上运行新迁移文件
  • 是否有一种方法可以根据默认数据库上的信息动态设置迁移文件的数据库连接



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

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

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

    首先,您需要创建数据库

     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')
    您好,我为您提供了一点帮助

    首先,在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);
    
    }
    
    第二步:

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

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

    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

    还没有时间测试,但这个答案似乎最可靠。我将首先奖励奖金,并在测试后将答案标记为正确。非常有趣的方法。我喜欢+1这在纸上听起来不错,我以前见过这种类型的实现,但这是一种糟糕的做法。Laravel认为配置文件中的闭包是不好的做法。当您尝试运行
    config:clear
    config:cache
    时,它将产生应用程序停止错误,解决这些错误的唯一方法是删除配置缓存,不再运行它。如果您有一个小应用程序,缓存配置可能不值得。但请注意,如果使用此解决方案,则在缓存配置时会遇到应用程序停止错误。