我有三个模型,我试图定义它们之间的关系。
模型: 用户 支付 债务人
- 用户有很多付款
- 付款属于用户
- 付款有很多债务人
- Debtor属于Payment
- Debtor属于Payment
我需要在源和目标中定义关系吗?即
User.hasMany(Payment, {as: 'Payments'})
还有
Payment.belongsTo(User)
或者我可以只在一个模型中定义它吗?
尝试在两者中定义它时,我似乎都遇到了错误。我导入的模型是 undefined
,因此当我尝试将它传递给“belongsTo()”或“hasMany()”函数时,出现错误 called with something that's not an instance of Sequelize .型号
当我只将它包含在一个模型中时,它不会正确地创建关系。
我的模型如下:
支付模式:
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 ]
})
}
最佳答案
发生这种情况是因为在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()
方法)并调用创建模型之间关系的 associate
函数。这样可以避免您提到的情况。
关于mysql - 在 sequelize 中声明关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504508/