声明关系的续集?
我有三个模型,我试图定义它们之间的关系。
模型:用户付款债务人
- 用户有很多付款
- 付款属于用户
- 付款有许多债务人
- 债务人属于付款
- 债务人属于付款
我需要在源和目标中定义关系吗? 即
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
函数。 这样可以防止你提到的情况。