[英]Laravel one domain, multiple database detected by Session
我已經閱讀了幾個關於主題SaaS,多租戶等的帖子/主題(比如這個 , 這個和這個 ),我得出結論,大多數帖子/主題都不符合我的要求:
我需要的工作流程 :
例:
- project_admin <- Main database
--- subscriptions <- Table
------ id | db_name
------ 1 | project_child_one
------ 2 | project_child_two
--- users <- Table
------ id | subscription_id
------ 1 | 1
------ 2 | 2
- project_child_one <- Child database
--- customers <- table
- project_child_two <- Child database
--- customers <- table
user 1
登錄時,從客戶檢索的數據應該來自數據庫project_child_one
。 user 2
登錄時,從客戶檢索的數據應該來自數據庫project_child_two
。 我希望數據庫名稱保存在會話中,因此我不需要總是查詢project_admin
以了解用戶應該連接到哪個數據庫。 這是簡單的部分。
好吧,我不確定這是不是你的意思。 但是,如果您希望db name是動態的,您可以輕松地在laravel中執行以下操作。 config的連接部分應該如上所述。 但是,您可以在運行時更改控制器上的數據庫憑據。 如果我們采用上面的例子進行配置。 您可以在控制器上執行此操作。
$config= [
'database'=>'Dynamic db name',
];
Config::set("database.connections.mysql2",$config);
DB::purge('mysql');
DB::setDefaultConnection('mysql2');
並且假設您想要在事務之后切換另一個數據庫,您可以這樣做
$config= [
'database'=>'Dynamic db name',
];
Config::set("database.connections.mysql",$config);
DB::purge('mysql2');
DB::setDefaultConnection('mysql2');
我希望它有所幫助
如果您確實需要“租戶”數據庫連接,那么您可以在中間件類中即時配置它:
class ConfigureTenantConnection
{
public function handle($request, Closure $next)
{
if ($user = $request->user()) {
// Create a tenant database connection if there is an authenticated user
config([
'database.connections.tenant' => [
'driver' => 'mysql',
// I don’t know what column names you use, but…
'host' => $user->database_host,
'port' => $user->database_port,
'database' => $user->database_name,
'username' => $user->database_username,
'password' => $user->database_password,
],
]);
}
return $next($request);
}
}
然后,您可以在數據庫查詢和模型中使用此tenant
連接:
abstract class TenantModel extends Model
{
protected $connection = 'tenant';
}
class Widget extends TenantModel
{
protected $table = 'widgets';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.