带有 Objective JS 的 INNER JOIN 查询?
INNER JOIN Query with Objection JS?
我得到了以下数据模型:https://imgur.com/a/AwwpW9F
基本上,一个 User
可以属于多个 Projects
,一个 Project
可以有多个 Users
,我通过连接将它们连接在一起 table 称为 UserProjects
通过原始 SQL 查询,我可以
SELECT "user".email, project.name FROM "user"
JOIN userprojects ON userprojects.user_id = "user".id
JOIN project ON project.id = userprojects.project_id
这给了我
email(On User table) name(On Project table)
first@email.com Project X
first@email.com Project Y
second@email Project Y
我将如何使用 Objection ORM 构造此查询?也许我可以直接做一个原始查询?像
User.query().raw(SELECT "user".email, project.name FROM "user"
JOIN userprojects ON userprojects.user_id = "user".id
JOIN project ON project.id = userprojects.project_id)
?
Nvm,找到解决方法
/关闭
JK,
如果其他人 运行 遇到同样的问题,以下是对我有用的方法:
return User.query().where("user_id", parent.id)
.join('userprojects', 'user.id', '=', 'userprojects.user_id')
.join('project', 'project.id', '=', 'userprojects.project_id')
.select('user.id', 'userprojects.project_id', 'project.name')
无需自己完成所有工作,Objection.js 可以为您完成。你可以只声明一个 ManyToManyRelation
.
static relationMappings = {
projects: {
relation: Model.ManyToManyRelation,
modelClass: Project, // imported Objection class of "Project"
join: {
from: 'user.id',
through: {
from: 'userprojects.user_id',
to: 'userprojects.project_id'
},
to: 'project.id'
}
}
}
然后你可以使用预先加载来获取用户的项目:
User.query().eager('projects').findById(userId)
你会得到类似的东西:
User {
id: 3,
firstname: 'firstname',
lastname: 'lastname',
email: 'email',
projects: [
{id: 1,
name: 'name1'},
{id: 2,
name: 'name2'},
]
}
2020 年更新:
自 Objection.js
版本 2 起,eager
方法已重命名为 withGraphFetched
:
User.query().withGraphFetched('projects').findById(userId)
我得到了以下数据模型:https://imgur.com/a/AwwpW9F
基本上,一个 User
可以属于多个 Projects
,一个 Project
可以有多个 Users
,我通过连接将它们连接在一起 table 称为 UserProjects
通过原始 SQL 查询,我可以
SELECT "user".email, project.name FROM "user"
JOIN userprojects ON userprojects.user_id = "user".id
JOIN project ON project.id = userprojects.project_id
这给了我
email(On User table) name(On Project table)
first@email.com Project X
first@email.com Project Y
second@email Project Y
我将如何使用 Objection ORM 构造此查询?也许我可以直接做一个原始查询?像
User.query().raw(SELECT "user".email, project.name FROM "user"
JOIN userprojects ON userprojects.user_id = "user".id
JOIN project ON project.id = userprojects.project_id)
?
Nvm,找到解决方法
/关闭
JK,
如果其他人 运行 遇到同样的问题,以下是对我有用的方法:
return User.query().where("user_id", parent.id)
.join('userprojects', 'user.id', '=', 'userprojects.user_id')
.join('project', 'project.id', '=', 'userprojects.project_id')
.select('user.id', 'userprojects.project_id', 'project.name')
无需自己完成所有工作,Objection.js 可以为您完成。你可以只声明一个 ManyToManyRelation
.
static relationMappings = {
projects: {
relation: Model.ManyToManyRelation,
modelClass: Project, // imported Objection class of "Project"
join: {
from: 'user.id',
through: {
from: 'userprojects.user_id',
to: 'userprojects.project_id'
},
to: 'project.id'
}
}
}
然后你可以使用预先加载来获取用户的项目:
User.query().eager('projects').findById(userId)
你会得到类似的东西:
User {
id: 3,
firstname: 'firstname',
lastname: 'lastname',
email: 'email',
projects: [
{id: 1,
name: 'name1'},
{id: 2,
name: 'name2'},
]
}
2020 年更新:
自 Objection.js
版本 2 起,eager
方法已重命名为 withGraphFetched
:
User.query().withGraphFetched('projects').findById(userId)