ВНУТРЕННЕЕ СОЕДИНЕНИЕ Запрос с возражением 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'},
]
}