Как получить продолжение, чтобы не использовать поля меток времени при генерации SQL для получения n: m связанных моделей? - PullRequest
0 голосов
/ 05 марта 2020

Мои модели:

'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;
};

и миграция для таблицы ассоциации (ссылки):

'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 генерирует SQL с полями updatedAt и createdAt. Как сказать sequelize генерировать SQL без полей меток времени?

Уточнение: Я хочу метки времени в моделях Corporate & Vendor, но нет в таблице ссылок / ассоциаций, и я хочу, чтобы запрос соединения (vendor.getCorporates()) был сгенерирован соответствующим образом.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Наконец решил эту проблему, написав модель для самой ассоциации 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.

0 голосов
/ 05 марта 2020

Вы можете указать это, используя опцию timestamps . Например:

const Corporate = sequelize.define('Corporate', {
        id: { type: DataTypes.INTEGER, allowNull: false, autoIncrement: true, primaryKey: true },
        // other fields
    }, {
      timestamps: false
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...