簡體   English   中英

Laravel 5多租戶應用程序具有單獨的數據庫 - 用戶可以訪問多個安裝

[英]Laravel 5 Multi-Tenancy App with separate databases - users have access to multiple installations

在過去的幾年里,我開發了一個非常定制的PHP / MySQL應用程序,用於許多客戶端。 到目前為止,我一直在為每個客戶創建一個新數據庫和新安裝。

這里的第一個明顯問題是保持多個安裝與任何代碼更改保持同步; 第二個問題是每個安裝都有大量用戶; 對大多數客戶而言; 其中一些用戶是相同的 - 他們必須要記住許多單獨的用戶帳戶和網址。

我現在正在將申請移至Laravel 5,並研究多租戶的最佳實施方案; 所以尋求關於最佳實施的一點建議。 我之前使用過Laravel,但絕不是專家。

就設置而言,這就是我的想法。

1個主數據庫,用於保存表:

  1. 所有用戶帳戶信息
  2. 訪問控制表 - 用戶可以訪問的安裝; 他們在該安裝上的用戶級別是什么。
  3. 每個安裝的配置表 - 數據庫連接信息,基本配置等。

然后是每個安裝的單獨數據庫,其中包含該安裝所需的所有信息以及提交給該安裝的所有信息。

理想的設置是用戶可以轉到子域,即installationname.appname.com; 使用他們的主登錄詳細信息登錄並自動進入所需的安裝; 或者轉到appname.com,登錄,然后選擇要連接的安裝。

我的問題是:

  1. 這是實現我所期待的最佳安排嗎?
  2. 存儲用戶正在查看的安裝的最佳方法是什么(會話變量)
  3. 我可以在兩個數據庫之間定義模型 - 可能將一個連接定義為主連接,然后使用master數據庫中的數據庫連接信息動態定義另一個連接以連接到正確的安裝。 - 系統通常需要檢查用戶信息的訪問級別等。

我確信有很多我沒有想過的問題; 但是,如果有人有任何鏈接或指導,可能有助於這將是偉大的。 第一次詢問關於SO的問題,但過去在這里找到了大量的研究幫助,感謝社區!


更新 - 所以我想我現在有辦法讓這項工作; 使用上述單獨的數據庫;

protected $connection = 'tenant_connection'

在與租戶特定的數據庫內容相關的模型中。

然后在頭文件中的某個位置根據已在login / by subdomain上設置的會話變量設置所需的tenant_connection。

$tenant = Installation::where('installation', '=', $session['installation'])->first();
Config::set('database.connections.tenant_connection', array('driver' => 'mysql', 'host' => $tenant->db_hostname, 'username' => $tenant->db_username)... etc.

假設關系可以跨越連接; 我不明白為什么這不起作用; 只需要找出最佳位置來設置租戶連接。

好的,我最終做的是擁有所有用戶信息,安裝名稱和用戶可以訪問一個數據庫中的安裝內容的映射,以及單獨數據庫中的所有租戶信息。

然后我有兩個連接,mysql和mysql_tenant; 其中mysql_tenant數據庫不是預先設置的,而是動態的。

User,Installations和mappings模型使用mysql連接,其他所有使用mysql_tenant

為每個安裝創建一個代碼,並將其用作租戶數據庫的名稱; 將此代碼存儲在會話中。

使用中間件MultiTenant,使用以下關鍵線控制安裝之間的切換:

$tenant_id = session()->get('tenant');

\Config::set('database.connections.mysql_tenant.database', $dbname);
\DB::setDefaultConnection('mysql_tenant');

構建切換方法等等還有很多,但這是要點。

很難回答大部分問題 - 因為它特定於您的申請和基於意見。

但我能回答的一點是不同的模型可以有不同的數據庫連接。 因此,您的user模型使用普通的默認連接 - 但您的其他模型可以使用其他連接:

class Example extends Model {

    protected $connection= 'second_db_connection';

}

然后在你的數據庫連接文件中 - 你會有這樣的東西:

return array(
    'connections' => array(
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        'second_db_connection' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),

Laravel 5已經足夠先進,您應該只需要一個安裝以及一個戰略數據庫,並且具有良好定義的關系和密鑰。 幾乎不需要多個數據庫。

如果您可以更具體地了解您的要求,我可以提供更具體的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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