Внутреннее соединение Sequelize не может получить правильное значение - PullRequest
0 голосов
/ 03 августа 2020

Я использую Sequelize для запроса трех моделей. Это компания, продукт и подписка.

Таблица компаний:

Company_ID int primary_key
Copmany_Name varchar(20)
Email varchar(20)

Таблица подписок:

Subscription_ID int primary_key
Company_ID int foreign key of company table
Product_ID int foreign key of product table
Subscription_order int

Таблица продуктов:

Product_ID int primary_key
Product_Name varchar(20)

мой код для обеих моделей:

модель подписки:

module.exports = (sequelize, DataTypes) =>
    sequelize.define(
        "Subscription",
        {
            subscriptionId: {
                type: DataTypes.INTEGER,
                primaryKey: true,
                allowNull: false,
                field: "Subscription_ID",
            },
            companyId: {
                type: DataTypes.INTEGER,
                field: "Company_ID",
                references: {
                    model: "Company",
                    key: "companyId",
                },
            },
            productId: {
                type: DataTypes.INTEGER,
                field: "Product_ID",
                references: {
                    model: "Product",
                    key: "productId",
                },
            },
            orderId: {
                type: DataTypes.INTEGER,
                field: "Subscription_order",
            },
        },
        ...

Модель компании:

module.exports = (sequelize, DataTypes) =>
    sequelize.define(
        "Company",
        {
            companyId: {
                type: DataTypes.INTEGER,
                primaryKey: true,
                allowNull: false,
                field: "Company_ID",
            },
            companyName: {
                type: DataTypes.STRING(50),
                field: "Company_Name",
            },
            email: {
                type: DataTypes.STRING(50),
                field: "Email",
            },
        },
        ...

Модель продукта:

module.exports = (sequelize, DataTypes) =>
    sequelize.define(
        "Product",
        {
            productId: {
                type: DataTypes.INTEGER,
                primaryKey: true,
                allowNull: false,
                field: "Product_ID",
            },
            productName: {
                type: DataTypes.STRING(100),
                field: "Product_Name",
            },
            ...

и Я установил следующие отношения:

Subscription.hasMany(Company, { foreignKey: "companyId", as: "companies" })
Company.belongsTo(Subscription, { foreignKey: "companyId" })
Subscription.hasMany(Product, { foreignKey: "productId", as: "products" })
Product.belongsTo(Subscription, { foreignKey: "productId" })

на моем контроллере:

const subscription = await Subscription.findAll({
            where: {
                companyId,
            },
            include: {
                model: Company,
            },
        })
res.status(200).send({ status: 0, data: subscription })

Я могу получить сведения о компании, например

{
    "status": 0,
    "data": {
        "companyId": 2,
        "companyName": "testCompany",
        "email": "test@gmail.com",
        }
}

, и сведения о подписке, когда я проверяю прочитайте детали компании и детали подписки отдельно, однако я всегда не могу показать детали объединенной компании:

...
{
    "subscriptionId": 2,
    "companyId": 2,
    "productId": 5,
    "orderId": 4,
    "products": [
        {
            "productId": 2,
            "productName": "testProduct"
        }
    ],
    "companies": [
        {
            "companyId": 1,
            "companyName": "testcompany",
            "email": "testcompany@gmail.com",
        }
    ]
},
...

Я ожидаю, что это то, что я использую SQL запрос для выполнения:

select * FROM Subscription subscription
INNER JOIN Company company on company.Company_ID = subscription.Company_ID
INNER JOIN Products products on products.Product_ID = subscription.Product_ID
where subscription.Company_ID= 2

Это будет повторяться, как показано ниже, идентификатор продукта и идентификатор компании совпадают:

...
{
    "subscriptionId": 2,
    "companyId": 2,
    "productId": 5,
    "orderId": 4,
    "products": [
        {
            "productId": 5,
            "productName": "testProduct"
        }
    ],
    "companies": [
        {
            "companyId": 2,
            "companyName": "testcompany",
            "email": "testcompany@gmail.com",
        }
    ]
},
...

Я не знаю, почему в моем сиквелизе включаются разные идентификаторы компании и продукта для отдельной части. Что не так с моим кодом?

Я вывожу журнал, и он говорит:

FROM
    [Subscription] AS [Subscription]
INNER JOIN [Products] AS [products] ON
    [Subscription].[Subscription_ID] = [products].[Product_ID]
LEFT OUTER JOIN [staging].[Dim_Company] AS [companies] ON
    [Subscription].[Subscription_ID] = [companies].[Company_ID]

Почему он использует subscription_id?

1 Ответ

0 голосов
/ 03 августа 2020

Я пропустил sourceKey в связи, правильный путь -

Subscription.hasMany(Company, { sourceKey: "companyId", foreignKey: "companyId", as: "companies" })
Subscription.hasMany(Product, { sourceKey: "productId", foreignKey: "productId", as: "products" })

без sourceKey, sequelize по умолчанию будет использовать первичный ключ для присоединения.

...