Как мне структурировать таблицу соединений с помощью ObjectionJS? - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь создать модель данных, которая выглядит следующим образом:

https://prnt.sc/mflh3t

По сути, пользователь может принадлежать ко многим проектам, и проект может иметь много пользователей.Я решил создать таблицу соединений под названием UserProjects.

Однако я не совсем уверен, как выглядит структура.Моя пользовательская модель в Objection выглядит следующим образом:

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

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

Должен ли я создать две новые схемы на Project и User по линиям

 class Project extends Model {
    static get tableName() {
      return 'project'
    }
    static get relationMappings() {
      return {
        userprojects: {
          relation: Model.HasManyRelation,
          modelClass: UserProjects,
          join: {
            from: 'project.id',
            to: 'userprojects.project_id'
          }
        }
      }
    }
  }
class User extends Model {
    static get tableName () {
      return 'user'
    }

    static get relationMappings () {
      return {
        timesheet: {
          relation: Model.HasManyRelation,
          modelClass: Timesheet,
          join: {
            from: 'user.id',
            to: 'timesheet.user_id'
          }
        },
        userprojects: {
          relation: Model.HasManyRelation,
          modelClass: UserProjects,
          join: {
            from: 'user_id',
            to: 'userprojects.user_id'
          }
        }
      }
    }
  }

В этомсценарий: как бы я добавил пользователей в проект?Через UserProjects таблицу?

1 Ответ

0 голосов
/ 02 февраля 2019

Я бы создал метод для добавления проекта для модели User, такой как:

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

    static get relationMappings () {
      return {
        timesheet: {
          relation: Model.HasManyRelation,
          modelClass: Timesheet,
          join: {
            from: 'user.id',
            to: 'timesheet.user_id'
          }
        },
        userprojects: {
          relation: Model.HasManyRelation,
          modelClass: UserProjects,
          join: {
            from: 'user.id',
            to: 'userprojects.user_id'
          }
        }
      }
    }

    static getModel(knex) {
        return User.bindKnex(knex)
    }

    static async getUser(knex, id) {
        return await User.getModel(knex).query().eager('[timesheet, userprojects]').where('id', id).first() 
    }

    async addProject(projectId){
        return await this.knex()
            .$relatedQuery('userprojects')
            .insert({project_id: projectId})
    }
}

Имейте в виду, я ничего не тестировал, просто написал здесь.Но так я бы организовал код.

...