在使用 Stancl/Tenancy
包实现 Laravel 多租户时,默认情况下,租户的数据库连接会使用 .env
文件中配置的数据库主机(通常是 DB_HOST
)。如果你想为每个租户自定义数据库连接主机,可以通过以下步骤实现。
Stancl/Tenancy
包允许你通过自定义 DatabaseConfig
类来覆盖默认的数据库连接配置。你可以通过以下步骤来实现:
DatabaseConfig
类首先,创建一个自定义的 DatabaseConfig
类,继承自 Stancl\Tenancy\DatabaseConfig
类,并覆盖 getConnectionDetails
方法。
namespace App\Tenancy\Database;
use Stancl\Tenancy\DatabaseConfig;
use Stancl\Tenancy\Contracts\Tenant;
class CustomDatabaseConfig extends DatabaseConfig
{
public function getConnectionDetails(Tenant $tenant): array
{
// 获取默认的数据库连接配置
$defaultConfig = parent::getConnectionDetails($tenant);
// 自定义数据库主机
$defaultConfig['host'] = $tenant->database_host; // 假设租户模型中有 database_host 字段
return $defaultConfig;
}
}
DatabaseConfig
类接下来,你需要在 AppServiceProvider
或 TenancyServiceProvider
中注册这个自定义的 DatabaseConfig
类。
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Stancl\Tenancy\DatabaseConfig;
use App\Tenancy\Database\CustomDatabaseConfig;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(DatabaseConfig::class, CustomDatabaseConfig::class);
}
}
database_host
字段确保你的租户模型中有 database_host
字段,并且该字段存储了租户的数据库主机地址。
namespace App\Models;
use Stancl\Tenancy\Contracts\Tenant;
use Stancl\Tenancy\Database\Concerns\HasDatabase;
use Stancl\Tenancy\Database\Concerns\HasDomains;
class Tenant implements Tenant
{
use HasDatabase, HasDomains;
protected $fillable = [
'database_host',
// 其他字段...
];
}
在创建租户时,确保为每个租户设置 database_host
字段。
$tenant = Tenant::create([
'database_host' => 'custom_host', // 自定义数据库主机
// 其他字段...
]);
现在,当你切换到某个租户时,系统会自动使用该租户的 database_host
作为数据库连接的主机。
database_host
字段的值是有效的数据库主机地址。database_host
字段。通过以上步骤,你可以为每个租户自定义数据库连接主机,从而实现更灵活的多租户数据库管理。