Разделение данных в мультитенантном приложении Symfony с использованием Doctrine - PullRequest
3 голосов
/ 16 апреля 2010

Я пытаюсь реализовать мультитенантное приложение, то есть - данные всех клиентов в одной базе данных - каждая общая таблица имеет поле tenant_id для разделения данных

Я хочу добиться разделения данных, добавив where('tenant_id = ', $user->getTenantID()) {псевдокод} на все запросы SELECT Я не мог найти никакого решения заранее, но вот возможные подходы, которые я рассматриваю. 1) грубый подход: настройка всех функций fetchAll и fetchOne в каждом классе (я сойду с ума!) 2) использование слушателей: возможно кодирование для события preDqlSelect и добавление 'where' ко всем запросам 3) переопределить buildQuery (): не удалось найти пример этого для внешнего интерфейса 4) реализовать contentformfilter: снова нужен указатель

Был бы признателен, если бы кто-то мог подтвердить их и прокомментировать эффективность, пригодность. Кроме того, если кто-то достиг многопользовательского режима с использованием другой стратегии, поделитесь pl. Спасибо

Ответы [ 4 ]

2 голосов
/ 28 апреля 2010

Я разрабатываю решение, используя прослушиватели Doctrine Record Listeners, кодируя событие preDqlSelect. Я думаю, что это лучший и самый простой способ сделать что-то общее, вместо того, чтобы модифицировать каждый класс Table и писать запросы с учетом требований Tenant. Для слушателей мульти-аренда будет полностью прозрачной для разработчиков.

Спасибо за участие.

1 голос
/ 23 сентября 2010

Я опубликовал sfMultiTenantPlugin, найдите его здесь: http://www.symfony -project.org / плагины / sfMultiTenantPlugin

1 голос
/ 16 апреля 2010

Я полагаю, что более выполнимый и безопасный способ - создать новую функцию для извлечения запроса с учетом требований арендатора, это пример ... Замените 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);

Таким образом вы создаете «Запрос Tenant Aware» при необходимости ... вы просто используете эту функцию при необходимости ... Даже в генераторе администратора есть способ в файле конфигурации переопределить метод запроса по умолчанию:

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

Осталось только создать этот метод.

Надеюсь, этот ответ вам подходит =)

0 голосов
/ 17 декабря 2011

Плагин sfMultiTenantPlugin не работает для leftJoin. Когда левое соединение B и B пусто, плагин вернет пустой набор результатов.

...