我的多数据库多租户方法看起来像这样......
在.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,您可以在应用的其他位置访问该常量。例如,在刀片文件中,如果您希望应用的导航栏徽标区域显示您可以使用的客户端名称...
{{ config('connection.subdomain') }}
这是我经过大量研究后选择做的事情。希望这种方法能帮助其他人做我想做的事情。