Как структурировать объединяющую таблицу с помощью ObjectionJS?

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

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 ответ

Я бы создал метод для добавления проекта для модели 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})
    }
}

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

Другие вопросы по тегам