【问题标题】:How to connect multi-database in multi-tenant in Laravel tenancyforlaravel如何在 Laravel 中多租户中连接多数据库 tenancyforlaravel
【发布时间】:2022-10-02 14:27:53
【问题描述】:

我正在学习如何开发 laravel 多租户、多数据库和多域 Web 应用程序。所以我正在使用tenancyforlaravel (archtechx/tenancy) 包(我第一次使用它)。所以我的问题是如何在创建新数据库并为其插入数据后连接它。波纹管代码对我有用。但我觉得应该有办法使用这个包来做到这一点,另一个问题是我们可以在两个数据库(如landload和其他数据库)之间创建关系吗?

在配置/数据库中,

\'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\'),
        ]) : [],
    ],

    \'mysql2\' => [
        \'driver\' => \'mysql\',
        \'url\' => env(\'DATABASE_URL\'),
        \'host\' => env(\'DB_HOST\', \'127.0.0.1\'),
        \'port\' => env(\'DB_PORT\', \'3306\'),
        \'database\' => null,
        \'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\'),
        ]) : [],
    ],

在 MyController 文件中,

    public function insertShop()
{
    $this->validate();

    $record = Tenant::updateOrCreate([\'id\' => $this->recordId], [
        \'plan\' => \'free\',
        \'user_id\' => Auth::user()->id,
    ]);

    $record->domains()->updateOrCreate([\'id\' => $this->recordId], [
        \'domain\' =>  $this->domain
    ]);

    Config::set(\'database.connections.mysql2.username\', $record->tenancy_db_username);
    Config::set(\'database.connections.mysql2.password\', $record->tenancy_db_password);
    Config::set(\'database.connections.mysql2.database\', $record->tenancy_db_name);
    DB::purge(\'mysql2\');
    DB::reconnect(\'mysql2\');

    ShopDetail::updateOrCreate([\'id\' => $this->recordId], [
        \'tenant_id\' =>  $record->id,
        \'account_type\' =>  $this->account_type,
        \'business_type\' =>  $this->business_type,
        \'name\' =>  $this->name,
    ]);

    $this->createTeam($record->id);
}

在 ShopDetails 模型中,

protected $connection = \'mysql2\';

protected $fillable = [
    \'tenant_id\',
    \'account_type\',
    \'business_type\',
    \'name\',
];
  • 你是按照官方文档来的吗?很难判断出了什么问题,但我很确定您的配置不正确......
  • 是的先生,我正在关注文档,但我无法弄清楚那部分。这就是为什么我最后想我应该从这里问。如果您可以参考学习,我真的很感激。谢谢

标签: laravel multi-tenant multi-database


【解决方案1】:

在以正确的方式参考文档后,我弄清楚了如何在创建后连接新数据库。这称为手动初始化。只需要这样做,

替换下面的代码,

    Config::set('database.connections.mysql2.username', $record->tenancy_db_username);
    Config::set('database.connections.mysql2.password', $record->tenancy_db_password);
    Config::set('database.connections.mysql2.database', $record->tenancy_db_name);
    DB::purge('mysql2');
    DB::reconnect('mysql2');

对此,

tenancy()->initialize($record);

并且需要从 ShopDetails 模型中移除手动连接,

protected $connection = 'mysql2'; //Remove this line

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多