我对多数据库多租户的处理方法如下。。。
.env
我添加了数据库。
# Database: Client 1
CLIENT_ONE_DB_CONNECTION=mysql
CLIENT_ONE_DB_HOST=127.0.0.1
CLIENT_ONE_DB_PORT=3306
CLIENT_ONE_DB_DATABASE=client_one_db
CLIENT_ONE_DB_USERNAME=root
CLIENT_ONE_DB_PASSWORD=
# Database: Client 2
CLIENT_TWO_DB_CONNECTION=mysql
CLIENT_TWO_DB_HOST=127.0.0.1
CLIENT_TWO_DB_PORT=3306
CLIENT_TWO_DB_DATABASE=client_two_db
CLIENT_TWO_DB_USERNAME=root
CLIENT_TWO_DB_PASSWORD=
在
config/database.php
文件我添加数据库。
'client_one' => [
'driver' => 'mysql',
'url' => env('CLIENT_ONE_DATABASE_URL'),
'host' => env('CLIENT_ONE_DB_HOST', '127.0.0.1'),
'port' => env('CLIENT_ONE_DB_PORT', '3306'),
'database' => env('CLIENT_ONE_DB_DATABASE', 'forge'),
'username' => env('CLIENT_ONE_DB_USERNAME', 'forge'),
'password' => env('CLIENT_ONE_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'),
]) : [],
],
'client_two' => [
'driver' => 'mysql',
'url' => env('CLIENT_TWO_DATABASE_URL'),
'host' => env('CLIENT_TWO_DB_HOST', '127.0.0.1'),
'port' => env('CLIENT_TWO_DB_PORT', '3306'),
'database' => env('CLIENT_TWO_DB_DATABASE', 'forge'),
'username' => env('CLIENT_TWO_DB_USERNAME', 'forge'),
'password' => env('CLIENT_TWO_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'),
]) : [],
],
/config/connection.php
看起来像这样。。。
<?php
$domain = request()->getHttpHost();
$domain_parts = explode('.', $domain);
$subdomain = $domain_parts[0];
if ($subdomain == 'clientone') {
config()->set('database.default', 'client_one');
}
if ($subdomain == 'clienttwo') {
config()->set('database.default', 'client_two');
}
return ['subdomain' => $subdomain];
就这样。我不必去搅乱路由或中间件,它们都带来了更深层次的挑战。这种方法使每件事都分离和简单。
另外,通过返回
subdomain
在配置中,您可以在应用程序的其他地方访问该常量。例如,在一个blade文件中,如果你想让你的应用程序的navbar logo区域显示你可以使用的客户端名称。。。
{{ config('connection.subdomain') }}
这是我经过大量研究后选择做的。希望这种方法能帮助其他人做我试图做的事情。