Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在Sequelize中的findAll()查询中同时使用include和attributes时出现问题_Mysql_Node.js_Postgresql_Sequelize.js - Fatal编程技术网

Mysql 在Sequelize中的findAll()查询中同时使用include和attributes时出现问题

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 = {

我在互联网上搜索了一个常见的问题,但我没有找到任何东西,所以我把问题贴在这里

我正在使用Sequelize for Node,并尝试查询我的PostgreSQL数据库以查找特定表中的所有对象。但是,我希望能够用链接表中的数据替换反外键(换句话说,连接表并删除ID)。通过使用“include”选项连接表和“attributes”选项取消选择Id并仅保留连接的值,我成功地做到了这一点,但由于我有一个hasMany关系,因此在执行查询时出现了一个错误

以下是我使用的选项:

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,它没有更改任何内容