2012-07-13 74 views
3

我想獲得一個多租戶系統安裝程序,其中每個用戶都有自己的前綴表。基於Symfony2中登錄用戶的Doctrine2動態表前綴

所以我的數據庫可能看起來像

users 
acme_posts 
my_posts 
their_posts 
our_posts 

this一種解決方案是一個良好的開端,但它不允許動態創建的前綴。

是否有可能修改上面的原則解決方案來設置基於登錄用戶的數據庫前綴?

另一種方法可能是擁有一個主用戶數據庫,然後爲用戶特定的表具有單獨的數據庫,但我不確定Doctrine是否可以處理多個數據庫之間的關係。

歡迎您提出任何建議。

回答

0

只需將EventListener定義爲服務(說明位於here),您可以非常容易地訪問Doctrine EventListener中的服務容器。然而,這種方法不會幫助你解決問題,因爲所有類的元數據只會被加載一次並被緩存,所以它不能瞭解不同的用戶。

我不明白你的用例,但是有沒有什麼理由不能簡單地向你的* _posts表中添加一個字段,以便你有一個包含「user_namespace」或類似的帖子表關鍵的一部分?

如果你的反對意見是簡單地塞滿有關記錄什麼用戶,可以通過使用prePersist學說的EventListener上設置新的實體適當user_namespace事情簡單化信息的控制器邏輯,以及一個Filter(用於主義> = 2.2)或custom DQL walker(其他所有內容)將所有查詢限制爲僅從適當的user_namespace中檢索實體。

+0

我不確定我是否正確理解「user_namespace」。你的意思是有一個帖子表與用戶表中的id字段有相關的字段嗎?我試圖避免這種情況,以保持租戶數據的獨立性,並將桌面尺寸降至最低,但也許這是要走的路... – Mike 2012-07-14 16:56:41

+0

是的,這正是我的意思 - 我能想到的唯一的其他優雅解決方案是使用每個用戶的不同應用程序實例,配置爲使用不同的數據庫。這很容易做到,但意味着您必須複製所有常見數據(例如您的用戶表),因爲就我所知,Doctrine不支持跨數據庫關聯 – 2012-07-14 18:09:08