簡體   English   中英

Laravel一個域,由Session檢測到多個數據庫

[英]Laravel one domain, multiple database detected by Session

我已經閱讀了幾個關於主題SaaS,多租戶等的帖子/主題(比如這個這個這個 ),我得出結論,大多數帖子/主題都不符合我的要求:

  1. 我不需要多租戶,因為我只會使用主域
  2. 我不能寫.env也不能在database.config中寫入我所有的MySQL連接,因為它們都是動態的(至少是數據庫的名稱)

我需要的工作流程

  1. 訂閱(SaaS)包含數據庫名稱
  2. 每當用戶登錄時,它就會為其會話分配數據庫名稱
  3. 將所有查詢運行到用戶數據庫

例:

- 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM