【问题标题】:Change database connection according to domain根据域更改数据库连接
【发布时间】:2019-12-01 01:28:41
【问题描述】:

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

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

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

]

域 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 的每个 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();
}

}

预期结果:

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

【问题讨论】:

    标签: php mysql database laravel model


    【解决方案1】:

    Partner_domain 模型中已经建立了默认连接。

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

    RouteServiceProvider

        $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;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 2017-12-26
      • 1970-01-01
      • 2015-07-23
      • 2020-09-26
      • 2019-02-26
      • 1970-01-01
      • 2018-07-27
      • 2019-05-29
      相关资源
      最近更新 更多