[英]Laravel 5 Multi-Tenancy App with separate databases - users have access to multiple installations
在過去的幾年里,我開發了一個非常定制的PHP / MySQL應用程序,用於許多客戶端。 到目前為止,我一直在為每個客戶創建一個新數據庫和新安裝。
這里的第一個明顯問題是保持多個安裝與任何代碼更改保持同步; 第二個問題是每個安裝都有大量用戶; 對大多數客戶而言; 其中一些用戶是相同的 - 他們必須要記住許多單獨的用戶帳戶和網址。
我現在正在將申請移至Laravel 5,並研究多租戶的最佳實施方案; 所以尋求關於最佳實施的一點建議。 我之前使用過Laravel,但絕不是專家。
就設置而言,這就是我的想法。
1個主數據庫,用於保存表:
然后是每個安裝的單獨數據庫,其中包含該安裝所需的所有信息以及提交給該安裝的所有信息。
理想的設置是用戶可以轉到子域,即installationname.appname.com; 使用他們的主登錄詳細信息登錄並自動進入所需的安裝; 或者轉到appname.com,登錄,然后選擇要連接的安裝。
我的問題是:
我確信有很多我沒有想過的問題; 但是,如果有人有任何鏈接或指導,可能有助於這將是偉大的。 第一次詢問關於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.