如何在Laravel tenancyforlaravel中连接多租户中的多数据库

pcww981p  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(239)

我正在学习如何开发一个laravel多租户、多数据库和多域的web应用程序。所以我使用tenancyforlaravel(建筑技术/租赁)包(我第一次使用它)。所以我的问题是如何连接新的数据库后,创建它和插入数据。贝娄代码为我工作。但我觉得应该有一种方法来做这件事使用这个包,另一个问题是我们能不能在两个数据库之间建立关系,比如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',
];
kninwzqo

kninwzqo1#

在正确的参考了文档之后,我弄清楚了新建数据库后如何连接,这叫做手动初始化,只需要这样做,
替换以下代码,

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

相关问题