Как присоединиться к одной и той же таблице 2 раза с разными псевдонимами и условиями с помощью Sequelize? - PullRequest
2 голосов
/ 11 июля 2020

У меня есть 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.

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

...