ObjectionJs 获取具有多对多关系的实体

Posted

技术标签:

【中文标题】ObjectionJs 获取具有多对多关系的实体【英文标题】:ObjectionJs fetch entity with many to many relationship 【发布时间】:2021-12-28 19:09:57 【问题描述】:

我正在使用 knex-objection。 我有一个简单的 3 个表示例: user、authority_user、authority,其中“user”和“authority”通过多对多关系连接在一起。

关系代码:

static get relationMappings() 

    return 
        authorities: 
            relation: Model.ManyToManyRelation,
            modelClass: path.join(__dirname, 'Authority'),

            join: 
                from: 'user.id',
                through:
                    from: 'user_authority.user_id',
                    to: 'user_authority.authority_id'
                ,
                to: 'authority.id'
            
        
    

关系有效,我已经插入了一个具有一个权限的用户并检查了它。 问题是急切加载用户的权限会返回一个未定义的权限数组,如下所示:

  User 
id: 2,
username: 'someuser',
email: 'someuser@gmail.com',
password: '$2b$10$DztbTKBMsElxH0kk9nK8x.73bgl3W.rZnhzqFH5XRR2FSkYcROzm2',
is_active: 1,
created_at: '2021-12-28 18:10:30',
updated_at: '2021-12-28 18:10:30',
authorities: [ [Authority] ]

]

这里的权限数组是未定义的,而我可以清楚地获取关系并获取我的用户权限:await User.relatedQuery('authorities').for(2) 给出:

  sql: 'select `authority`.* from `authority` inner join `user_authority` on `authority`.`id` = `user_authority`.`authority_id` where `user_authority`.`user_id` in (?)'

结果:[权限 id:1,名称:'ROLE_USER']

编辑: 我试图获取具有 2 个权限的用户,这是输出:

User 
id: 3,
username: 'test',
email: 'test@gmail.com',
password: '$2b$10$3GWQd5b2.JwIvtyyOi/0zOKogY7kOG2aJhUqdFhlYpFvisPgeI62u',
is_active: 1,
created_at: '2021-12-29 08:42:50',
updated_at: '2021-12-29 08:42:50',
authorities: [ [Authority], [Authority] ]

ObjectionJs 似乎“知道”了 2 个权威反对意见,但他们只是没有“出现”并且权威数组仍然未定义......

【问题讨论】:

【参考方案1】:

查询时可以使用withGraphFetched

await User
.query()
.withGraphFetched('[authorities]')
.findById(id)
.throwIfNotFound(message: "User not found.")
.then(async user=>  ...)

【讨论】:

感谢您的回复。您的要求效果很好,我也尝试使用“withGraphJoined”,它也有效。

以上是关于ObjectionJs 获取具有多对多关系的实体的主要内容,如果未能解决你的问题,请参考以下文章

如何获取没有多对多关系的实体

MVC 多对多仅在代码中首先获取具有某种类型的实体

核心数据:获取特定对象的多对多关系中的所有实体?

具有多个多对多关系的休眠批处理事务

具有多对多关系的核心数据 NSPredicate

如何在不更新具有多对多关系的子实体的情况下保留父实体?