Objection.js中的多对多关系

时间:2019-04-05 19:23:56

标签: javascript node.js orm objection.js

我有一个用户可以拥有多个平台的项目。这些平台可以具有许多密码。目前,我具有以下数据库结构:

enter image description here

我正在尝试使用紧急加载获取以下对象:

{
    "id": 1,
    "username": "Keith",
    "platforms": [
        {
            "id": 1,
            "name": "Jira",
            "passwords": [
                {
                    "id": 1,
                    "password": "hash"
                },
                {
                    "id": 2,
                    "password": "otherhash"
                }
            ]
        },
        {
            "id": 2,
            "name": "Confluence",
            "passwords": [
                {
                    "id": 3,
                    "password": "anotherhash"
                },
                {
                    "id": 4,
                    "password": "anotherone"
                }
            ]
        }
    ]
}

我花了几个小时,无法弄清楚。我如何定义关系以获得这种结构?这可能吗?

1 个答案:

答案 0 :(得分:1)

据我所知,不为该三向联接表创建自己的模型是不可能的。

所以模型看起来像这样:

class User extends objection.Model {
  static get tableName() {
    return 'user';
  }

  static get relationMappings() { 
    return {
      platformPasswords: {
        relation: Model.HasManyRelation,
        modelClass: UserPlatformPassword,
        join: {
          from: 'user.id',
          to: 'user_platform_password.user_id'
        }
      }
    }
  }
}

class Platform extends objection.Model {
  static get tableName() {
    return 'platform';
  }
}

class Password extends objection.Model {
  static get tableName() {
    return 'password';
  }
}

class UserPlatformPassword extends objection.Model {
  static get tableName() {
    return 'user_platform_password';
  }

  static get relationMappings() { 
    return {
      password: {
        relation: Model.HasOne,
        modelClass: Password,
        join: {
          from: 'user_platform_password.password_id',
          to: 'password.id'
        }
      },
      platform: {
        relation: Model.HasOne,
        modelClass: Platform,
        join: {
          from: 'user_platform_password.platform_id',
          to: 'platform.id'
        }
      }
    }
  }
}

也许还有其他方法可以至少对那些关系进行建模,以使其在进行急切选择时能起作用,但是我很难理解如果您想插入/向上插入该关系,它将如何起作用嵌套数据,其中多个关系处理同一个联接表的不同字段。