使用Doctrine在Symfony多租户应用程序中进行数据分离

时间:2010-04-16 07:11:30

标签: symfony1 doctrine multi-tenant

我正在尝试实现多租户应用程序,即 - 单个数据库中所有客户端的数据 - 每个共享表都有一个tenant_id字段来分隔数据

我希望通过添加where('tenant_id = ', $user->getTenantID()) {伪代码}来实现数据分离 所有SELECT查询 我在前面找不到任何解决方案,但这是我正在考虑的可行方法。 1)原油方法: 自定义每个班级中的所有fetchAllfetchOne函数(我会生气!) 2)使用听众: 可能编码preDqlSelect事件并在所有查询中添加“where” 3)覆盖buildQuery():无法找到前端的示例 4)实现contentformfilter:再次需要一个指针

如果有人可以验证这些&评论效率,适用性。 此外,如果有人使用其他策略实现多租户,则分享。感谢

4 个答案:

答案 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为空时,插件将返回空结果集。