Objection.js 中的多对多关系
Posted
技术标签:
【中文标题】Objection.js 中的多对多关系【英文标题】:Many-to-Many-to-Many relationship in Objection.js 【发布时间】:2019-04-05 19:23:56 【问题描述】:我有一个项目,用户可以拥有许多平台。这些平台可以有很多密码。目前我有以下数据库结构:
我正在尝试使用预先加载来获取以下对象:
"id": 1,
"username": "Keith",
"platforms": [
"id": 1,
"name": "Jira",
"passwords": [
"id": 1,
"password": "hash"
,
"id": 2,
"password": "otherhash"
]
,
"id": 2,
"name": "Confluence",
"passwords": [
"id": 3,
"password": "anotherhash"
,
"id": 4,
"password": "anotherone"
]
]
我花了几个小时想不通。我如何定义关系以获得这种结构?这可能吗?
【问题讨论】:
【参考方案1】:据我所知,如果不为该 3 路连接表创建自己的模型,这是不可能的。
所以模型看起来像这样:
class User extends objection.Model
static get tableName()
return 'user';
static get relationMappings()
return
platformPasswords:
relation: Model.HasManyRelation,
modelClass: UserPlatformPassword,
join:
from: 'user.id',
to: 'user_platform_password.user_id'
class Platform extends objection.Model
static get tableName()
return 'platform';
class Password extends objection.Model
static get tableName()
return 'password';
class UserPlatformPassword extends objection.Model
static get tableName()
return 'user_platform_password';
static get relationMappings()
return
password:
relation: Model.HasOne,
modelClass: Password,
join:
from: 'user_platform_password.password_id',
to: 'password.id'
,
platform:
relation: Model.HasOne,
modelClass: Platform,
join:
from: 'user_platform_password.platform_id',
to: 'platform.id'
也许还有其他一些方法可以对这些关系进行建模,至少在进行急切选择时它们可以工作,但我很难理解它是如何工作的,以防你想插入/更新插入嵌套数据,其中多个关系处理同一个连接表的不同字段。
【讨论】:
谢谢!我正在寻找的确实是不可能的。我最终将我的数据库结构更改为这个:jsfiddle.net/1bwLomgz。现在急切加载更容易,但我觉得数据库变得更难阅读......所以我想知道实现这种多对多关系的最佳方法/实践是什么 也许通过有 2 个单独的连接表,一个用于平台,它链接用户和平台,然后第二个用于密码,它使用具有 user_id 和 platform_id 设置vincit.github.io/objection.js/recipes/… 的复合键链接用户、密码和平台或在 postgresql 的情况下,您还可以将密码列表存储在 JSONB 列中作为连接表中的额外字段。在上一个示例中的 cmets 中提到了这里 vincit.github.io/objection.js/api/model/… 哇,不知道最后一个功能。非常感谢以上是关于Objection.js 中的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server Analysis Services 中的多对多关系;第二个多对多关系不起作用