Я использую 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?