首先确保您为每个模型调用Model.associate。这将为所有关系运行查询。
您可以在 associate 方法中定义如下关系:
// user.js (User Model definition)
module.exports = (sequelize, dataTypes) => {
const { STRING } = dataTypes
const User = sequelize.define("user", {
username: { type: STRING }
})
User.associate = models => {
User.hasOne(models.Portfolio, { foreignKey: "userId" }) // If only one portfolio per user
User.hasMany(models.Portfolio) // if many portfolios per user
}
return User
}
// portfolio.js (Portfolio Model definition)
module.exports = (sequelize, dataTypes) => {
const { STRING } = dataTypes
const Portfolio = sequelize.define("portfolio", {
portfolioName: { type: STRING }
})
Portfolio.associate = models => {
Portfolio.belongsTo(models.User, { foreignKey: "userId" })
}
return Portfolio
}
hasOne 将 foreignKey 存储在目标模型中。所以这个关系会给Portfolio模型添加一个外键userId。
belongsTo 存储当前模型中的键,并引用目标模型的主键。在这种情况下,Portfolio.belongsTo 将在 Portfolio 模型中添加 userId,这将引用 User 模型的主键。
注意这两种关系是如何做同样的事情的,它们将 userId 添加到 Portfolio 模型中。最好在两个模型中为您的最后一个用例定义这个:
我希望它能够引用创建它的用户,并且每次获取该用户的数据时,我希望它也获取他们的投资组合数据(如果有的话)。
访问相关模型:
在 sequelize 中,将相关模型与主模型一起获取称为 Eager Loading。阅读更多关于它的信息here。
现在对于您的用例,如果您想获取投资组合(如果有的话),请在获取用户时执行以下操作:
var userWithPortfolio = await User.findAll({include: [models.Portfolio]};
// Or you may also use include: {all: true} to include all related models.
var userWithPortfolio = await User.findAll({include: {all: true}};
/*
Output:
userWithPortfolio = {
username: "xyz",
portfolio: {
portfolioName: "xyz"
}
}
*/