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') 具有灵活的价值。
模型中已建立默认连接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)
两个数据库连接无法连接。您必须使用模型关系运行查询两次,如下所示:
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)
class User extends Model
{
public function configBank()
{
return $this->hasOne(ConfigBank::class, 'bank_id', 'bank_id');
}
}
Run Code Online (Sandbox Code Playgroud)
$user = User::find(1); // test data
if ($user && $user->configBank) {
$data['bank_name'] = $user->configBank->bank_name;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |