排序模型,迁移文件和外键。哪一个是对的?

jwk*_*koo 5 model node.js express sequelize.js

第一次学习sequelize时,我只是一无所知,只是复制并粘贴了涉及两个模型之间关系的代码。

我是否必须同时向模型文件和迁移文件插入外键还是仅向迁移文件插入外键,这真让我感到困惑。

我知道迁移是具有更改数据库命令的文件。

因此,我们绝对必须手动将外键插入迁移文件,以便数据库可以创建外键。

在sequelize doc中,如果我们添加具有许多且属于的关系,则sequelize将自动添加外键。

所以我真的很困惑是否必须添加它们。

在五十点之前我问了一些问题。

有人说我们不必手动将外键添加到模型中,因为sequelize会自动添加它们。

但是有人说我们必须手动向模型添加外键,因为我们必须在模型和迁移文件之间匹配(同步)列。

更糟糕的是,解释sequelize关系的文章彼此不同。

所以,哪一个是对的?

我真的很想得到明确的答案。

得到一些理由真的很感谢(如果我们必须在模型中添加外键)

毫不夸张地说,我对这个问题好奇了大约六个月。

小智 7

在创建迁移时,您还应该编写外键。也把它写在模型中,这样处理查询会很容易。我们可以通过例子来看看。考虑它们是两个表 Item 和 Item_Types

1 Item_type 有很多项目,所以,

Item_type 的迁移文件 (migration_create_item_type.js)

'use strict';
module.exports = {
up: function (queryInterface, Sequelize) {
    return queryInterface.createTable('item_types', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        },
        item_type: {
            type: Sequelize.STRING
        },
        type_desc: {
            type: Sequelize.STRING
        },
        createdAt: {
            allowNull: true,
            type: Sequelize.DATE,
            defaultValue: Sequelize.NOW
        },
        updatedAt: {
            allowNull: true,
            type: Sequelize.DATE,
            defaultValue: Sequelize.NOW
        }
    });
},
down: function (queryInterface, Sequelize) {
    return queryInterface.dropTable('item_types');
}
};
Run Code Online (Sandbox Code Playgroud)

项目的迁移文件 (migration_create_item.js)

'use strict';
module.exports = {
up: function (queryInterface, Sequelize) {
    return queryInterface.createTable('items', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        },
        item_name: {
            type: Sequelize.STRING
        },
        item_desc: {
            type: Sequelize.STRING
        },
        item_type_id: {
            type: Sequelize.INTEGER,
            references: {
                model: 'item_types',
                key: 'id'
            }
        },
        createdAt: {
            allowNull: false,
            type: Sequelize.DATE
        },
        updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
        }
    });
},
down: function (queryInterface, Sequelize) {
    return queryInterface.dropTable('items');
}
};
Run Code Online (Sandbox Code Playgroud)

请注意,始终先创建父表,然后创建其他表,即创建所有没有外键的表,然后创建其他表

模型文件 Item_type (item_type.js)

'use strict';
module.exports = function (sequelize, DataTypes) {
var item_type = sequelize.define('item_type', {
    item_type: DataTypes.STRING,
    type_desc: DataTypes.STRING
});
item_type.associate = function (models) {
    item_type.hasMany(models.item, {foreignKey: 'item_type_id'});
};
return item_type;
};
Run Code Online (Sandbox Code Playgroud)

模型文件项目(item.js)

'use strict';
 var Logger = require('./../utils/logger');

 var log = new Logger('item_type_factory');
 module.exports = function (sequelize, DataTypes) {
 var item = sequelize.define('item', {
    item_name: DataTypes.STRING,
    item_desc: DataTypes.STRING
 });
 item.associate = function (models) {
    item.item_type = item.belongsTo(models.item_type, {foreignKey: 'id', target_key: 'item_type_id'});
    item.order_details = item.hasMany(models.order_details);
    item.user = item.belongsToMany(models.user, {through: 'supplier_items'})
};

item.addNewItem = function (data) {
    return item.create(data, {include: [{association: item.item_type}]});
};

item.findAndCreate = function (data, item_name) {
    return new Promise(function (resolve, reject) {
        item.findOrCreate({
            where: {'item_name': item_name}, defaults: data
        }).spread(function (record_data, created) {
            resolve(record_data);
        }).catch(function (insert_error) {
            reject(insert_error);
        });
    });
};

item.findAllItems = function () {
    return item.findAll({
        include: [{association: item.item_type}]
    });
};
return item;
};
Run Code Online (Sandbox Code Playgroud)

有关 sequelize 的基础知识,您可以参考以下文章 Sequelize入门 仅用于基础知识。