3

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

我希望通过向所有 SELECT 查询添加 {pseudoc-code} 来实现数据分离where('tenant_id = ', $user->getTenantID()),但我事先找不到任何解决方案,但这里有一些我正在考虑的可能方法。1)粗略的方法:在每个类中自定义所有fetchAllfetchOne函数(我会发疯的!) 2)使用侦听器:可能为preDqlSelect事件编码并将“位置”添加到所有查询 3)覆盖buildQuery():找不到示例这用于前端 4) 实现contentformfilter:再次需要一个指针

如果有人可以验证这些并评论效率,适用性,将不胜感激。另外,如果有人使用另一种策略实现了多租户,请分享。谢谢

4

4 回答 4

2

我正在通过编码 preDqlSelect 事件来制定使用 Doctrine Record Listeners 的解决方案。我认为这是以通用方式做事的最好和最简单的方法,而不必修改每个 Table 类并编写租户感知查询。有了监听器,多租户将对开发人员完全透明。

感谢您的参与。

于 2010-04-28T11:43:02.000 回答
1

我已经发布了 sfMultiTenantPlugin,在这里找到它: http ://www.symfony-project.org/plugins/sfMultiTenantPlugin

于 2010-09-23T13:49:26.513 回答
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);

通过这种方式,您可以在需要时创建“租户感知查询”...您只需在需要时使用此功能...即使在管理生成器中,配置文件中也有一种方法可以覆盖默认查询方法:

# apps/backend/modules/(module)/config/generator.yml
config:
  list:
    table_method: retrieveTenantAwareResult

剩下的就是创建这个方法。

希望这个答案对你有用=)

于 2010-04-16T15:26:23.073 回答
0

sfMultiTenantPlugin插件不适用于leftJoin. 当 A left join B 且 B 为空时,插件将返回一个空的结果集。

于 2011-12-17T08:32:58.103 回答