在生成 SQL 以获取 n:m 关联模型时,如何让 sequelize 不使用时间戳字段?

How do I get sequelize to not use timestamp fields when generating SQL for getting n:m associated models?

我的模特:

'use strict';
module.exports = (sequelize, DataTypes) => {
    const Vendor = sequelize.define('Vendor', {
        id: { type: DataTypes.INTEGER, allowNull: false, autoIncrement: true, primaryKey: true },
        // other fields
    }, {});
    Vendor.associate = function (models) {
        Vendor.belongsToMany(models.Corporate, { through: 'VendorCorporates', foreignKey: 'vendorId' });
    };
    return Vendor;
};

'use strict';
module.exports = (sequelize, DataTypes) => {
    const Corporate = sequelize.define('Corporate', {
        id: { type: DataTypes.INTEGER, allowNull: false, autoIncrement: true, primaryKey: true },
        // other fields
    }, {});
    Corporate.associate = function (models) {
        Corporate.belongsToMany(models.Vendor, { through: 'VendorCorporates', foreignKey: 'corporateId' });
    };
    return Corporate;
};

以及协会的迁移 (link) table:

'use strict';

const vendorCorps = 'VendorCorporates', vendorId = 'vendorId', corpId = 'corporateId';

module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable(vendorCorps, {
            vendorId: {
                type: Sequelize.INTEGER,
                references: {
                    model: 'Vendors',
                    key: 'id'
                },
                onUpdate: 'CASCADE',
                onDelete: 'CASCADE'
            },
            corporateId: {
                type: Sequelize.INTEGER,
                references: {
                    model: 'Corporates',
                    key: 'id'
                },
                onUpdate: 'CASCADE',
                onDelete: 'CASCADE'
            },
            // notice no timestamps
        });
    },

    down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('VendorCorporates');
    }
};

现在,当我尝试获取与供应商关联的企业时:

let vendor = await models.Vendor.findByPk(pk);
let corporates = await vendor.getCorporates();

查询失败,因为 sequelize 使用字段 updatedAtcreatedAt 生成 SQL。我如何告诉 sequelize 在没有 时间戳字段的情况下生成 SQL

澄清: 我想要 CorporateVendor 模型中的时间戳,但是 link/association none table,我希望相应地生成连接查询 (vendor.getCorporates())。

您可以使用 timestamps 选项来指明这一点。例如:

const Corporate = sequelize.define('Corporate', {
        id: { type: DataTypes.INTEGER, allowNull: false, autoIncrement: true, primaryKey: true },
        // other fields
    }, {
      timestamps: false
});

最终通过为 n:m 协会本身编写模型解决了这个问题:

'use strict';
module.exports = (sequelize, DataTypes) => {
    const VendorCorporate = sequelize.define('VendorCorporate', {
        vendorId: DataTypes.INTEGER,
        corporateId: DataTypes.INTEGER
    }, { timestamps: false });
    VendorCorporate.associate = function (models) {
        // associations can be defined here
    };
    return VendorCorporate;
};

并改变:

// db/models/vendor.js

Vendor.belongsToMany(models.Corporate, { through: 'VendorCorporates', foreignKey: 'vendorId' });

至:

Vendor.belongsToMany(models.Corporate, { through: models.VendorCorporate, foreignKey: 'vendorId' });

并在 Corporate 模型文件中进行类似的更改。