У меня есть 3 таблицы:
Таблица пользователей:
---------------
userId | name
---------------
1 | Alice
2 | Bob
3 | Charly
---------------
Таблица проектов:
-------------------------------------
projectId | userId | state | color
-------------------------------------
4 | 1 | active | red
5 | 1 | closed | blue
6 | 2 | closed | green
7 | 3 | active | yellow
-------------------------------------
Topi c таблица:
--------------------------------
topicId | projectId | topicName
--------------------------------
7 | 4 | D
8 | 4 | e
9 | 5 | D
10 | 6 | D
--------------------------------
Ассоциации:
User.hasMany(model.Project)
Project.hasMany(model.Topics)
Я бы хотел найти всех User
s, у которых:
- есть хотя бы один
project
, который связан с некоторыми topic
по условию (где name='D'
); - включить все
projects
, которые находятся в состоянии active
;
Итак, в результате я хочу иметь
--------------------------------------
userId | userName | projectId | color
--------------------------------------
1 | Alice | 4 | red
2 | Bob | 6 | green
--------------------------------------
Примерно так:
const users = await User.findAll({
include: [{
model: Project,
include: [{
model: Topics,
where: { name: 'D' },
attributes: [],
}],
attributes: [],
}, {
model: Project,
where: { status: 'active'},
required: false,
attributes: ['color'],
}]
})
Я могу решить эту проблему, если добавлю еще одну ассоциацию:
User.hasMany(models.Project, { as: 'ProjectTopics' });
и добавлю к запросу as: ProjectTopics
на 4-й строке. Но я не хочу иметь две ассоциации с одной таблицей с одинаковыми ключами, только с разными псевдонимами.
В документации есть строка :
options.include[].through.as
The alias for the join model, in case you want to give it a different name than the default one.
Не могли бы вы помочь мне понять, как это работает и как я могу использовать это в своей проблеме?