Mysql 在Sequelize中的findAll()查询中同时使用include和attributes时出现问题
我在互联网上搜索了一个常见的问题,但我没有找到任何东西,所以我把问题贴在这里 我正在使用Sequelize for Node,并尝试查询我的PostgreSQL数据库以查找特定表中的所有对象。但是,我希望能够用链接表中的数据替换反外键(换句话说,连接表并删除ID)。通过使用“include”选项连接表和“attributes”选项取消选择Id并仅保留连接的值,我成功地做到了这一点,但由于我有一个hasMany关系,因此在执行查询时出现了一个错误 以下是我使用的选项:Mysql 在Sequelize中的findAll()查询中同时使用include和attributes时出现问题,mysql,node.js,postgresql,sequelize.js,Mysql,Node.js,Postgresql,Sequelize.js,我在互联网上搜索了一个常见的问题,但我没有找到任何东西,所以我把问题贴在这里 我正在使用Sequelize for Node,并尝试查询我的PostgreSQL数据库以查找特定表中的所有对象。但是,我希望能够用链接表中的数据替换反外键(换句话说,连接表并删除ID)。通过使用“include”选项连接表和“attributes”选项取消选择Id并仅保留连接的值,我成功地做到了这一点,但由于我有一个hasMany关系,因此在执行查询时出现了一个错误 以下是我使用的选项: options = {
options = {
include: [
{
model: models.ProviderType,
attributes: ['id', 'name'],
as: 'providerType',
},
{
model: models.SavingProduct,
attributes: ['id', 'name'],
as: 'savingProducts',
},
],
attributes: [
'id',
'name',
'siteUrl',
'logoPath',
'createdAt',
'updatedAt',
'deletedAt',
],
}
并执行以下查询:
SELECT "Provider".*, "providerType"."id" AS "providerType.id", "providerType"."name" AS "providerType.name", "savingProducts"."id" AS "savingProducts.id", "savingProducts"."name" AS "savingProducts.name"
FROM (
SELECT "Provider"."id", "Provider"."name", "Provider"."siteUrl", "Provider"."logoPath", "Provider"."createdAt", "Provider"."updatedAt", "Provider"."deletedAt"
FROM "Provider" AS "Provider"
WHERE "Provider"."deletedAt" IS NULL
LIMIT 20 OFFSET 0
) AS "Provider"
LEFT OUTER JOIN "ProviderType" AS "providerType" ON "Provider"."providerTypeId" = "providerType"."id"
LEFT OUTER JOIN "SavingProduct" AS "savingProducts" ON "Provider"."id" = "savingProducts"."providerId" AND ("savingProducts"."deletedAt" IS NULL);
引发的错误是:“列提供程序.providerTypeId不存在”。这是合乎逻辑的,因为在选择嵌入式SELECT时,我不选择Provider.providerTypeId,因为我不希望返回此列,并且正因为如此,在尝试加入表时,SQL找不到此列并返回错误
换句话说,Sequelize首先选择想要的值,然后连接,而我希望它做相反的事情,即连接表,然后只选择需要的列
所以我理解这个错误,但我没有找到任何方法用链接表中的数据替换外键。这是可能的,我没有采取正确的方向去做,所以如果你看到一些更容易和更干净的,我会非常感激
以下是模型定义:
对于提供者
module.exports = (sequelize, DataTypes) => {
const Provider = sequelize.define('Provider', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
siteUrl: {
type: DataTypes.STRING,
allowNull: true,
},
logoPath: {
type: DataTypes.STRING,
allowNull: true,
},
}, {
freezeTableName: true,
paranoid: true,
});
Provider.associate = (models) => {
Provider.belongsTo(models.ProviderType, { as: 'providerType' });
Provider.hasMany(models.SavingProduct, { as: 'savingProducts', foreignKey: 'providerId' });
};
return Provider;
};
节约产品
module.exports = (sequelize, DataTypes) => {
const SavingProduct = sequelize.define('SavingProduct', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
}, {
freezeTableName: true,
paranoid: true,
});
SavingProduct.associate = (models) => {
SavingProduct.belongsTo(models.Provider, { as: 'provider', foreignKey: 'providerId' });
};
return SavingProduct;
};
如果我不清楚,请不要犹豫告诉我,我很乐意为您提供更多信息
多谢各位 尝试将关联声明为Provider.belongsTo(models.ProviderType,{as:'ProviderType',foreignKey:'Provider_type_id'))谢谢您的评论@Anatoly,它没有更改任何内容