【问题标题】:Seeding tenant database in Laravel 5在 Laravel 5 中播种租户数据库
【发布时间】:2016-02-13 05:37:22
【问题描述】:

我正在使用 laravel 5 中的主数据库和多个租户数据库构建系统。我有一个主数据库的数据库迁移和种子没有问题,使用 php artisan migrate:refresh --seed

然后租户在注册后获得自己的数据库。我需要在租户数据库上运行迁移和种子。

租户迁移文件存储在单独的文件夹中。使用以下命令运行迁移(不幸的是在主数据库上)

\Artisan::call('migrate', [
        '--path'     => "database/migrations_system"
       );

但是我需要在租户数据库上进行迁移,比如 DB_1。

我阅读了以下内容应该可以工作

\Artisan::call('migrate', [
    '--path'     => "database/migrations_system",
    '--database' => 'db_1'
    ]);

但是我最终得到了一个错误

InvalidArgumentException in DatabaseManager.php line 238:

数据库 [db_1] 未配置。

卡住....如何指定要在特定数据库上运行的迁移?

更新:

我发现更改 config/database.php 并添加 db_1 让我摆脱了这个错误....

'db_1' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => 'db_1',
            'username'  => env('DB_USERNAME', 'root'),
            'password'  => env('DB_PASSWORD', 'pass'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
            'port' => '3306'
        ],

但是这种连接是未知的,需要即时完成,我也被困在如何完成......

再次更新和工作解决方案....即时修改配置...

 $connections = \Config::get('database.connections');
        $tenant_database = 'db_1'; //assign from your main database
        $tenant_connection = [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => $tenant_database ,
            'username'  => env('DB_USERNAME'),
            'password'  => env('DB_PASSWORD'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
            'port' => '3306'
        ];
        $connections['tenant'] = $tenant_connection;
        \Config::set('database.connections', $connections);
       \Artisan::call('migrate', [
        '--path'     => "database/migrations_system",
        '--database' => 'tenant'
        ]);

所以看起来我已经回答了我自己的问题,但是也许有些人可以对此程序发表评论。

【问题讨论】:

    标签: php laravel-5 database-migration laravel-artisan


    【解决方案1】:

    我会写下我自己的解决方案.... 1)创建数据库名称 例如,我将新数据库命名为db_1,其中 1 代表系统在主数据库中的 ID。我考虑在主数据库中存储一个唯一的加扰名称。最后,这似乎有点矫枉过正。

    2) 创建连接 - 为此我使用与新数据库完全相同的名称。

    public function createConnection()
    {
        $connections = \Config::get('database.connections');
    
        if(!isset($connections[$this->getSystemName()]))
        {
    
            $tenant_connection = [
                'driver'    => 'mysql',
                'host'      => env('DB_HOST', 'localhost'),
                'database'  => $this->getSystemName(),
                'username'  => env('DB_USERNAME'),
                'password'  => env('DB_PASSWORD'),
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
                'strict'    => false,
                'port' => '3306'
            ];
    
            $connections[$this->getSystemName()] = $tenant_connection;
    
            \Config::set('database.connections', $connections);
            //dd(\Config::get('database.connections'));
        }
    }
    

    3) 创建数据库,您可以使用主连接来完成此操作

    $sql = "CREATE DATABASE " . $this->tenant_name; 
    DB::connection('main_db')->statement($sql);
    

    4) 运行迁移

    $r = \Artisan::call('migrate', [
                    '--path'     => "database/migrations_tenant",
                    '--database' => $this->tenant_name
                ]);
    

    5) 最后,您可以播种测试数据或加载一些默认数据。像这样访问连接

    DB::connection($this->system_name)->table($table)->insert($csv);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-21
      • 2018-12-11
      • 2015-09-25
      • 1970-01-01
      • 2015-04-13
      • 2016-02-10
      相关资源
      最近更新 更多