在使用Doctrine的Symfony多租户应用中实现数据分离

4
我正在尝试实现一个多租户应用程序,即 - 所有客户的数据存储在单个数据库中 - 每个共享表都有一个tenant_id字段来区分数据
我希望通过向所有SELECT查询添加where('tenant_id = ', $user->getTenantID()) {伪代码}来实现数据分离。 我找不到任何解决方案,但这里有可能考虑的方法。 1)粗暴的方法: 在每个类中自定义所有fetchAllfetchOne函数(我会疯掉!) 2)使用监听器: 可能编写preDqlSelect事件的代码,并将“where”添加到所有查询中 3)覆盖buildQuery():找不到前端的示例 4)实现contentformfilter:同样需要指针
如果有人能够验证这些并评论其效率和适用性,我将不胜感激。 此外,如果有人使用其他策略实现了多租户,请分享。谢谢
3个回答

2

我正在使用Doctrine记录监听器来解决问题,通过编写preDqlSelect事件的代码。我认为这是以通用方式处理事物的最佳且最简单的方式,而不必修改每个表类并编写针对租户的查询语句。使用监听器,多租户将对开发人员完全透明。

感谢您的参与。


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

现在唯一剩下的就是创建这个方法。

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


1
我会疯掉的,每个查询/表都要添加这个! - Prasad
传递用户ID也很痛苦。到目前为止,这个插件对我来说运行得非常好。 - Prasad

1

现在链接损坏了吗? - Musa Haidari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接