在我第一次开始研究续集时,我只是不知道,只需要复制并粘贴代码来实现两个模型之间的关系.
我是否必须将外键插入模型文件和迁移文件或仅迁移文件,这让我很困惑.
所以我们必须手动将外键插入迁移文件,以便数据库可以创建它们.
在sequelize doc中,如果我们添加有许多属于的关系,sequelize会自动添加外键.
所以我真的很困惑我是否必须添加它们.
在答案是五十五分之前我问过的一些问题.
有人说我们不必手动将外键添加到模型中,因为sequelize会自动添加它们.
但有些人说我们必须手动将外键添加到模型中,因为我们必须在模型和迁移文件之间匹配(同步)列.
更糟糕的是,解释关于续集关系的文章彼此不同.
那么,哪一个是对的?
我真的想得到明确的答案.
得到一些理由(如果我们必须在模型中添加外键)真的很感激
不夸张,我对这个问题好奇了大约六个月.
解决方法
在创建迁移时,您还应该编写外键.也可以在模型中编写它,因此很容易处理查询.
我们可以通过示例看到它.考虑他们是两个表Item和Item_Types
我们可以通过示例看到它.考虑他们是两个表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,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',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 } }); },Sequelize) { return queryInterface.dropTable('items'); } };
请注意,始终创建父表,然后创建其他表,即创建所有没有外键的表,然后创建其他表
模型文件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; };
模型归档项目(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; };
有关sequlize基础知识,您可以参考以下文章,
Getting started with Sequelize仅限基础知识.