创建迁移时,还应该编写外键。也可以将它写在模型中,这样可以很容易地处理查询。
我们可以通过例子看到。考虑它们是两种表项和项类型
1个项目类型有许多项目,因此,
项目类型的迁移文件(migration创建项目类型.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');
}
};
项目的迁移文件(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');
}
};
请注意,总是先创建父表,然后创建其他表,即创建所有没有外键的表,然后创建其他表。
模型文件项类型(项类型.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;
};
项目的模型文件(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;
};
有关亮片的基础知识,您可以参考以下文章,
Getting started with Sequelize
仅用于基础。