【问题标题】:INNER JOIN Query with Objection JS?带有异议 JS 的 INNER JOIN 查询?
【发布时间】:2019-06-27 12:17:27
【问题描述】:

我得到以下数据模型:https://imgur.com/a/AwwpW9F

基本上,一个User 可以属于多个Projects,一个Project 可以有多个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

这给了我

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)

?

【问题讨论】:

    标签: javascript node.js postgresql objection.js


    【解决方案1】:

    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')
    

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

      • 有趣的方法,不知道你可以用反对做那种类型的内连接。不过,我正在使用 GraphQL 进行查询,所以这会把事情搞砸,但感谢您的提示。很高兴知道
      • Objection.js 具有有趣的 Graph 功能。我建议你检查他们vincit.github.io/objection.js/#graph-inserts :)
      • 哇,Objection JS 总是让我惊讶——多么了不起的 ORM
      • 感谢您提供的出色示例。我不明白为什么我不断得到“未知关系”。事实证明,我必须在模型中命名我的关系。 +1!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2017-01-24
      相关资源
      最近更新 更多