Отношение «многие ко многим ко многим» в Objection.js - PullRequest
1 голос
/ 05 апреля 2019

У меня есть проект, где у пользователя может быть много платформ.Эти платформы могут иметь много паролей.В настоящее время у меня есть следующая структура базы данных:

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"
                }
            ]
        }
    ]
}

Iпровел несколько часов и не мог понять.Как я мог определить отношения, чтобы получить эту структуру?Это возможно?

1 Ответ

1 голос
/ 08 апреля 2019

Насколько я знаю, невозможно создать собственную модель для этой таблицы трехстороннего соединения.

Таким образом, модели будут выглядеть примерно так:

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

Может быть, есть и другие способы смоделировать эти отношения, по крайней мере, таким образом, чтобы они работали, когда вы делаете энергичный выбор, но мне трудно понять, как это может работать в случае, когда вы хотите вставить / отменить это вложенные данные, где несколько отношений имеют дело с разными полями одной и той же таблицы соединений.

...