Попытка соединить две таблицы базы данных в Sequelize с помощью таблицы соединения - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь получить запрос всех продавцов, связанных с пользователем.

Существует три таблицы:

user_tbl, user_favorite_tbl и merchant_tbl

Для каждого я создал экземпляр Sequelize.

User, UserFavorite и Merchant.

Я пытаюсь выполнить запрос, который получит меня в расчете на пользователя для каждого выбранного продавца. через user_favorite_tbl.

Вот мой код:

public async fetch_user_with_favorite() {
    let favMerchants = await User.findAll({
        attributes: ["given_name", "family_name", "email"],
        include: [
            {
                model: UserFavorite,
                attributes: ["merchant_id"],
                include: [
                    {
                        model: Merchant,
                        attributes: ["name"]
                    }
                ]
            }
        ]
    });
    return favMerchants;
}

И

User.belongsToMany(Merchant, { through: "user_favorite_tbl" });
Merchant.belongsToMany(User, { through: "user_favorite_tbl" });

Однако, когда я пытаюсь вызвать конечную точку, связанную с этим кодом, я получаю следующая ошибка:

SequelizeEagerLoadingError: user_favorite_tbl is not associated to user_tbl!

Когда я пытаюсь добавить это:

User.hasMany(UserFavorite, { foreignKey: "user_id" });
Merchant.hasMany(UserFavorite, { foreignKey: "merchant_id" });

Я получаю эту ошибку:

SequelizeEagerLoadingError: merchant_tbl is not associated to user_favorite_tbl!

Где именно я иду не так?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Ваша belongsToMany ассоциация выглядит корректно, однако, когда у вас belongsToMany, у вашего findAll не должно быть средней таблицы в include. through внутренне заботится об ассоциации среднего стола.

let favMerchants = await User.findAll({
    attributes: ["given_name", "family_name", "email"],
    include: [
        {
            model: Merchant,
            attributes: ["name"],
            through: { attributes: [] } // if you do not need any metadata in user_favorite_tbl.
        }
    ]
});

На примечании стороны

User.belongsToMany(Merchant, { through: "user_favorite_tbl" });

Возможно, лучше использовать

User.belongsToMany(Merchant, { through: UserFavorite });

0 голосов
/ 14 января 2020

Вы можете определить ассоциации, как показано ниже - отношения «многие ко многим» могут быть достигнуты с использованием двух отношений «один ко многим», как показано ниже: *

User.hasMany(UserFavorite, { foreignKey: 'user_id', targetKey: 'id'});
UserFavorite.hasMany(User,{ foreignKey: 'user_id',targetKey: 'id'});
Merchant.hasMany(UserFavorite, { foreignKey: 'merchant_id', targetKey: 'id'});
UserFavorite.hasMany(Merchant,{ foreignKey: 'merchant_id',targetKey: 'id'});
...