eri*_*kvm 3 javascript postgresql node.js objection.js
我得到以下数据模型:https : //imgur.com/a/AwwpW9F
基本上, AUser可以属于 many Projects,而 aProject可以有 many Users,我通过一个名为的连接表将它们捆绑在一起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
Run Code Online (Sandbox Code Playgroud)
这给了我
email(On User table) name(On Project table)
first@email.com Project X
first@email.com Project Y
second@email Project Y
Run Code Online (Sandbox Code Playgroud)
我将如何使用 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)
Run Code Online (Sandbox Code Playgroud)
?
Ras*_*mon 13
instead of doing all the stuff by yourself, Objection.js can do it for you. You can just declare a 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'
}
}
}
Run Code Online (Sandbox Code Playgroud)
Then you can just get the projects of a User using eager loading:
User.query().eager('projects').findById(userId)
Run Code Online (Sandbox Code Playgroud)
And you will get something like:
User {
id: 3,
firstname: 'firstname',
lastname: 'lastname',
email: 'email',
projects: [
{id: 1,
name: 'name1'},
{id: 2,
name: 'name2'},
]
}
Run Code Online (Sandbox Code Playgroud)
2020 Update:
Since version 2 of Objection.js, eager method has been renamed as withGraphFetched:
User.query().withGraphFetched('projects').findById(userId)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5543 次 |
| 最近记录: |