带有反对 JS 的内部联接查询?

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)