根据域更改数据库连接



我们在同一应用程序上运行多个域。

目前,我们的数据库环境设置是将配置数据库复制到每个数据库服务器。从属服务器拥有配置数据库和用户数据库。

我们正在通过检查使用的域来确定路由服务提供商上的数据库连接.php。

域 1 将与数据库服务器 A 连接 (config_db + A_user_db)。 例:

database.php

'connections' => [  
'db_config' => [
'driver' => 'mysql',
'host' => '192.168.0.10', 
'port' => 'XXXX',
'database' => 'config_db',
'username' => 'xxxx',
'password' => 'xxxx'
],    
'db_user_a' => [
'driver' => 'mysql',
'host' => '192.168.0.10', 
'port' => 'XXXX',
'database' => 'a_user_db',
'username' => 'xxxx',
'password' => 'xxxx'
],    
]

域 2 将与数据库服务器 B 连接 ( config_db + B_user_db )。 例:

database.php

'connections' => [   
'db_config' => [
'driver' => 'mysql',
'host' => '192.168.0.5', 
'port' => 'XXXX',
'database' => 'config_db',
'username' => 'xxxx',
'password' => 'xxxx'
],      
'db_user_b' => [
'driver' => 'mysql',
'host' => '192.168.0.5', 
'port' => 'XXXX',
'database' => 'b_user_db',
'username' => 'xxxx',
'password' => 'xxxx'
],      
]

在同一服务器上与用户数据库连接的 config db 的用法如下:

$db_config = config('database.connections.db_config.database').'.';
$data['bank_name'] = User::rightJoin($db_config.'config_bank as cb','user.bank_id','=','cb.bank_id')->first(['cb.bank_name']); 

我们如何保持db_config的灵活性,以便与当前用户数据库连接?

我们在数据库中定义了 db 的每个数据库连接,我们尝试使用配置常量,但我们的模型无法读取配置的连接。

class RouteServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'AppHttpControllers';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
//
// get the encrypter service
$encrypter = app(IlluminateContractsEncryptionEncrypter::class);
if(Request()->go) {
$basepath = Request()->go;
Cookie::queue('go', $basepath, 60*24*7);                   
}  
$row=Partner_domain::where('basepath',$basepath)->first();
if(($row)){ 
// returns db_user_a OR db_user_b 
config(['database.default'     => $row->db_name]); 
}
parent::boot();
}

}

预期成果:

config('database.connections.db_config.database')将具有灵活的价值.

已在Partner_domain模型中建立了缺省连接。

因此,您必须更改设置,然后重新连接默认连接。

路由服务提供商

$row=Partner_domain::where('basepath',$basepath)->first();
if(($row)){
// returns db_user_a OR db_user_b
config(['database.default'     => $row->db_name]);
config(['database.connections.db_config.host' => '192.168.0.5']);  // change host
DB::reconnect();
}

建议:将数据库连接与Partner_domain分开。 (例如。 database.connections.db_partner_domain)

模型

无法连接两个数据库连接。必须使用模型关系运行查询两次,如下所示:

  1. 创建ConfigBank模型。
class ConfigBank extends Model
{
protected $connection = 'db_config';
protected $table = 'config_bank';
public function user()
{
return $this->belongsTo(User::class, 'bank_id', 'bank_id');
}
}
  1. 添加与"用户"模型的关系。
class User extends Model
{
public function configBank()
{
return $this->hasOne(ConfigBank::class, 'bank_id', 'bank_id');
}
}
  1. 使用两个数据库连接。
$user = User::find(1);   // test data
if ($user && $user->configBank) {
$data['bank_name'] = $user->configBank->bank_name;
}

最新更新