带有 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)