Отказ от ответственности: я соавтор и один из текущих сопровождающих LoopBack.
как динамически изменять источник данных?
Следующий ответ StackOverflow описывает решение о том, как присоединить одну модель (например, Product) к нескольким источникам данных: https://stackoverflow.com/a/28327323/69868 Это решение будет работать, если вы создаете одну базу данных MySQL для компании вместо использования имени компании в качестве префикс имени таблицы продуктов.
Чтобы добиться того, что вы описали, вы можете использовать подклассы моделей. Для каждой компании определите новую модель продукта для конкретной компании, унаследованную от общей модели Product
и изменив имя таблицы.
// common/models/company1-product.json
{
"name": "Company1_Product",
"base": "Product",
"mysql": {
"tableName": "company1_Products"
}
// etc.
}
Вы даже можете создавать эти модели на лету, используя API-интерфейсы app.registry.createModel()
и app.model()
, а затем запускать dataSource.autoupdate
для создания таблиц SQL для новых моделей.
А как обращаться с пользователями? Хранить в одной таблице нехорошо, потому что внутренние пользователи компании могут быть в разных компаниях ...
Полагаю, вы можете использовать тот же подход, что и для Продуктов, и как вы описали в своем вопросе.
Может быть, есть лучший способ сделать такие модели?
Проблема, с которой вы сталкиваетесь, - это многопользовательский режим. Боюсь, мы еще не нашли простое в использовании решение. Существует много возможных способов реализации мультитенантности.
Например, вы можете создать одно приложение LoopBack для каждой компании (арендатора), а затем создать приложение LoopBack или Express верхнего уровня для маршрутизации входящих запросов в соответствующий экземпляр приложения LB для конкретного арендатора. См. Следующий репозиторий для реализации концепции: https://github.com/strongloop/loopback-multitenant-poc