在续集中宣布关系?

时间:2017-02-28 09:12:58

标签: mysql node.js sequelize.js

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

模型: 用户 付款 债务人

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

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

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

以及

Payment.belongsTo(User)

或者我可以在一个模型中定义它吗?

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

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

我的模型如下:

付款方式:

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;

//编辑

当我尝试使用付款创建新用户时,收到错误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 ]
    })
}

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为在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(所有这些模型最初都在一个位置,但你可以通过修改自动生成的文件来改变它)。 / p>

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