我正在尝试实现多租户应用程序,即
- 单个数据库中所有客户端的数据
- 每个共享表都有一个tenant_id
字段来分隔数据
我希望通过添加where('tenant_id = ', $user->getTenantID())
{伪代码}来实现数据分离
所有SELECT查询
我在前面找不到任何解决方案,但这是我正在考虑的可行方法。
1)原油方法:
自定义每个班级中的所有fetchAll
和fetchOne
函数(我会生气!)
2)使用听众:
可能编码preDqlSelect
事件并在所有查询中添加“where”
3)覆盖buildQuery
():无法找到前端的示例
4)实现contentformfilter
:再次需要一个指针
如果有人可以验证这些&评论效率,适用性。 此外,如果有人使用其他策略实现多租户,则分享。感谢
答案 0 :(得分:2)
我正在通过对preDqlSelect事件进行编码来使用Doctrine Record Listeners来制定解决方案。我认为这是最好的&以通用方式执行操作的最简单方法,而不是必须修改每个Table类并编写租户感知查询。对于听众来说,多租户对开发人员来说是完全透明的。
感谢您的参与。
答案 1 :(得分:1)
我相信更可行和安全的方法是创建一个新功能来检索租户感知查询,这是一个示例...将MyModel替换为您的表名:
// lib/model/doctrine/MyModelTable.class.php
class MyModelTable extends Doctrine_Table
{
public function createTenantAwareQuery($userId)
{
$q = $this->createQuery('m')
->where('tenant_id = ', $userId);
return $q;
}
}
然后使用这个新函数只需调用:
$myVar = Doctrine_Core::getTable('MyModel')->createTenantAwareQuery()
->where('something = ', $value);
通过这种方式,您可以在需要时创建“租户感知查询”...您只需在需要时使用此功能...即使在管理生成器中,配置文件中也有一种方法可以覆盖默认查询方法: / p>
# apps/backend/modules/(module)/config/generator.yml
config:
list:
table_method: retrieveTenantAwareResult
唯一剩下的就是创建这个方法。
希望这个答案适合你=)
答案 2 :(得分:1)
我发布了sfMultiTenantPlugin,在这里找到它: http://www.symfony-project.org/plugins/sfMultiTenantPlugin
答案 3 :(得分:0)
sfMultiTenantPlugin
插件不适用于leftJoin
。当A左连接B和B为空时,插件将返回空结果集。