node.js - 节点 - 将表与 Sequelize 关联
问题描述
我试图以这样的方式关联表:
- 一个组有很多文档
- 一个文档属于一个组
- 一个组属于一个用户
- 一个用户有很多组
当我尝试列出表“组”中的所有内容(包括“用户”)时,会抛出一个错误,指出用户未与组关联。
我的模型:
文档.js
const Document = conn.define('document', {
title: {
type: Sequelize.TEXT,
allowNull: false
},
content: {
type: Sequelize.TEXT,
allowNull: false
},
footer: {
type: Sequelize.TEXT,
}
})
Document.sync()
Document.associate = (models) => {
Document.belongsTo(models.Group, {foreignKey: 'groupId', as: 'Group'})
}
module.exports = Document
Group.js
const Group = conn.define('group', {
name: {
type: Sequelize.STRING,
allowNull: false
},
})
Group.sync()
Group.associate = (models) => {
Group.hasMany(models.Document, {foreignKey: 'groupId', as: 'Document'})
Group.belongsTo(models.User, {foreignKey: 'userId', as: 'User'})
}
module.exports = Group
用户.js
const User = conn.define('user', {
firstName: {
type: Sequelize.STRING,
allowNull: false
},
lastName: {
type: Sequelize.STRING,
allowNull: false
},
email: {
type: Sequelize.STRING,
},
password: {
type: Sequelize.STRING
},
})
User.sync()
User.associate = (models) => {
User.hasMany(models.Group, {foreignKey: 'groupId', as: 'Group'})
}
module.exports = User
解决方案
我在您的代码中看到一个错误。您应该为一对多关系使用相同的外键名称。否则,您的数据库中将有两个不同的列。
在这里,您应该使用 userId 作为外键。Sequelize 在“belongsTo”模型中创建 id 列。因此,如果您像这样使用它,Group 模型中将有一个 userId:
User.hasMany(models.Group, {foreignKey: 'userId', as: 'Group'});
Group.belongsTo(models.User, {foreignKey: 'userId', as: 'User'});
也尽量不要在模型文件中创建关联。考虑使用 index.js 文件,您可以在其中创建所有关联。
src
app.js
models
index.js
user.js
group.js
document.js
将模型定义保存在他们的文件中。导出创建的模型类。将它们包含在您的 index.js 文件中。创建必要的关联并再次导出它们。
src/models/index.js
const User = require('./user');
const Group = require('./group');
const Document = require('./document');
User.hasMany(models.Group, {foreignKey: 'userId', as: 'Group'});
Group.belongsTo(models.User, {foreignKey: 'userId', as: 'User'});
// Define what associations you need.
module.exports = {
User,
Group,
Document
};
推荐阅读
- reactjs - 如何在反应组件中使用 withRouter
- django - 在 Django 中订购过滤器结果
- javascript - React.js 使用来自 cef 的自定义 js 函数
- bash - 如何从我的 bash 历史记录中删除与特定模式匹配的行?
- spring-data-jpa - 如何从具有特定投影名称的服务/控制器调用 Spring Data 存储库方法?
- c - 如何释放内存并同时返回指针?
- python - 如何将 pandas isin 输出数据帧转换为 json 或列表格式
- azure - 连接 Azure VM 的 Azure Ad 域
- python - 如果它在具有匹配索引的python中的2个列表中,如何更改一个值
- python - 本地托管的 Django 项目,可在本地网络中长期使用