ВНУТРЕННЕЕ СОЕДИНЕНИЕ Запрос с возражением JS?

Я получил следующую модель данных: 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)

?

2 ответа

Решение

Нвм, нашел решение

/близко

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

Вместо того, чтобы делать все самостоятельно, Objection.js может сделать это за вас. Вы можете просто объявить ManyToManyRelation,

  static relationMappings = {
    projects: {
      relation: Model.ManyToManyRelation,
      modelClass: Project,
      join: {
        from: 'user.id',
        through: {
          from: 'userprojects.user_id',
          to: 'userprojects.project_id'
        },
        to: 'project.id'
      }
    }
  }

Тогда вы можете просто получить проекты пользователя, используя готовую загрузку:

User.query().eager('projects').where("id", userId).first()

И вы получите что-то вроде:

User {
  id: 3,
  firstname: 'firstname',
  lastname: 'lastname',
  email: 'email',
  projects: [
    {id: 1,
    name: 'name1'},
    {id: 2,
    name: 'name2'},
  ]
}
Другие вопросы по тегам