声明关系的续集?

我有三个模型,我试图定义它们之间的关系。

模型:用户付款债务人

  • 用户有很多付款
  • 付款属于用户
  • 付款有许多债务人
  • 债务人属于付款
  • 债务人属于付款

我需要在源和目标中定义关系吗? 即

User.hasMany(Payment, {as: 'Payments'}) 

并且

 Payment.belongsTo(User) 

或者我可以摆脱只是在一个模型中定义它?

试图在两者中定义它时,我似乎都会遇到错误。 我导入的模型是undefined ,因此当我尝试将它传递给“belongsTo()”或“hasMany()”函数时,我得到的错误called with something that's not an instance of Sequelize.Model

当我只将它包含在一个模型中时,它不会正确地创build关系。

我的模特如下:

付款方式:

 import { sequelize } from '../config'; import Sequelize from 'sequelize'; import User from './User'; const Payment = sequelize.define('payment', { amount: { type: Sequelize.FLOAT }, reference: { type: Sequelize.STRING }, user_id: { type: Sequelize.INTEGER } }); Payment.belongsTo(User) export default Payment; 

用户型号:

 import { sequelize } from '../config'; import Sequelize from 'sequelize'; import Payment from './Payment'; const User = sequelize.define('user', { email: { type: Sequelize.STRING }, username: { type: Sequelize.STRING }, firstName: { type: Sequelize.STRING }, lastName: { type: Sequelize.STRING }, facebookID: { type: Sequelize.STRING } }); User.hasMany(Payment, {as: 'Payments'}) export default User; 

//编辑

当我尝试使用付款创build新用户时,我得到的错误payment is not associated to user!

 exports.create = (req, res) => { User.create({ email: 'test3@gmail.com', firstName: "Test", lastName: "Test", username: 'fnord', payment: [ { amount: 10.00}, ] }, { include: [ Payment ] }) } 

发生这种情况是因为在payment时需要User模型,反之亦然, user需要Payment (循环依赖)。 为了避免这种情况,你必须在同一个文件中声明两个模型,或者你可以按照Sequelize推荐的方式

 module.exports = (sequelize, DataTypes) => { return sequelize.define('modelName', { // attributes }, { // additional options, like classMethods in which you could create the association classMethods: { associate: function(models) { this.belongsTo(models.Model); this.hasMany(models.Model); } } }); } 

为了实现它,你将不得不使用sequelize-cli模块。 如果你安装了它,你可以使用sequelize init命令生成一个文件,将所有的模型注册到这个sequelize(所有这些模型最初都在一个位置,但是你可以通过修改自动生成的文件来改变它)。

在这种情况下,sequelize遍历每个模型,注册它(使用sequelize.import()方法)并调用创build模型之间关系的associate函数。 这样可以防止你提到的情况。