根据域更改数据库连接

xyo*_*nme 5 php mysql database model laravel

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

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

我们通过检查使用的域来确定RouteServiceProvider.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'
    ],    

]
Run Code Online (Sandbox Code Playgroud)

域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'
    ],      
]
Run Code Online (Sandbox Code Playgroud)

与同一服务器上的用户数据库连接的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']); 
Run Code Online (Sandbox Code Playgroud)

我们如何保持db_config灵活以与当前用户数据库联接?

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

   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 = 'App\Http\Controllers';

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    //
    // get the encrypter service
    $encrypter = app(\Illuminate\Contracts\Encryption\Encrypter::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();
}
Run Code Online (Sandbox Code Playgroud)

}

预期结果:

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

Bee*_*oon 0

模型中已建立默认连接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();
    }
Run Code Online (Sandbox Code Playgroud)

建议:将数据库连接与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');
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 添加与“用户”模型的关系。
class User extends Model
{
    public function configBank()
    {
        return $this->hasOne(ConfigBank::class, 'bank_id', 'bank_id');
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用两个数据库连接。
$user = User::find(1);   // test data
if ($user && $user->configBank) {
    $data['bank_name'] = $user->configBank->bank_name;
}
Run Code Online (Sandbox Code Playgroud)