POMM Postgresql множественная схема и глобальный класс

Мы столкнулись с двумя проблемами, не могли бы вы помочь нам решить эту проблему?

1) как динамически указывать на схему в POMM. Пример у меня есть public схема, в которой хранятся все данные о пользователях и частные схемы, связанные с каждым пользователем. Когда пользователь входит в логику, чтобы прочитать public схема, найдите частный номер схемы и перенаправьте пользователя к его частной схеме - как я могу добиться этого в POMM ( http://www.postgresql.org/docs/9.1/static/ddl-schemas.html). Внутри каждой частной схемы есть несколько таблиц (например, общие данные о сотрудниках / данные о зарплатах сотрудников и т. Д.).

2) Когда у нас есть несколько схем с одинаковой структурой таблицы (общие данные о сотруднике / данные о зарплате сотрудника), нам нужен один класс для работы со всеми схемами - теперь для каждой таблицы POMM генерирует один класс.

Спасибо вам за помощь.

1 ответ

Решение

По умолчанию менеджер моделей Pomm использует каждую схему как пространство имен и устанавливает отношения доступа, используя свое полное имя schema.relation,

Идея заключается в том, чтобы настроить менеджер модели, чтобы можно было угадать схему благодаря search_path переменная окружения.

Тебе необходимо template схема, где определены все общие отношения во всех схемах. Создайте модели, структуры и объекты только для этой схемы:

$ php vendor/bin/pomm pomm:generate:schema-all db_name template

Для каждого класса Model в конструкторе просто установите отношение без информации о схеме, например:

class EmployeeModel extends Model
{
    public function __construct()
    {
        $this->structure = new EmployeeStructure;
        $this->flexible_entity_class = '\Test\TemplateSchema\Employee';
        $this->structure->setRelation('employee'); // <- add this line
    }
}

Теперь, в вашем коде, просто установите search_path переменная окружения, как это:

$pomm
    ->getDefaultSession()
    ->getConnection()
    ->executeAnonymousQuery(
        sprintf("SET search_path to %s, public", $schema)
    );

// Look in the employee table in the given schema
$employees = $pomm
    ->getDefaultSession()
    ->getModel('\DbName\Template\EmployeeModel')
    ->findAll()
    ;

Каждый раз, когда вы меняете путь поиска, Template Файлы моделей будут указывать на таблицы в разных схемах.

Другие вопросы по тегам