3

マルチテナントアプリケーションを実装しようとしています。つまり、単一のデータベース内のすべてのクライアントのデータです。各共有テーブルには、tenant_idデータを分離するためのフィールドがあります。

すべてのSELECTクエリに{pseudoc-code}を追加してデータを分離したいのですが、where('tenant_id = ', $user->getTenantID())事前に解決策を見つけることができませんでしたが、検討しているアプローチは次のとおりです。1)大雑把なアプローチ:すべてのクラスのすべてfetchAllfetchOne関数をカスタマイズする(私は怒ります!)2)リスナーを使用する:preDqlSelectイベントをコーディングし、すべてのクエリに「where」を追加する可能性があります3)override buildQuery():の例を見つけることができませんでしたこれはフロントエンド用です4)実装contentformfilter:ここでもポインタが必要です

誰かがこれらを検証し、効率性、適合性についてコメントしていただければ幸いです。また、誰かが別の戦略を使用してマルチテナンシーを達成した場合は、plシェアします。ありがとう

4

4 に答える 4

2

I'm working out a solution using Doctrine Record Listeners by coding the preDqlSelect event. I think this is the best & easiest way to do things in a generic way, rather than having to modify every Table class and writing Tenant aware queries. With listeners, multi-tenancy will be completely transparent to developers.

Thanks for participating.

于 2010-04-28T11:43:02.000 に答える
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 に答える
1

sfMultiTenantPluginを公開しました。ここで見つけてください: http ://www.symfony-project.org/plugins/sfMultiTenantPlugin

于 2010-09-23T13:49:26.513 に答える
0

プラグインはではsfMultiTenantPlugin機能しませんleftJoin。Aが左結合Bであり、Bが空の場合、プラグインは空の結果セットを返します。

于 2011-12-17T08:32:58.103 に答える