sequelize.js - Sequelize 中的关联表对我来说毫无意义(多对多)
问题描述
我正在尝试学习如何使用 Sequelize,而且我是 ORM 的新手,而关联的概念让我非常困惑,这让我考虑回到 SQL。
我有一张Artists
桌子和一张Genres
桌子。一位艺术家可以演奏多种流派,并且流派可以由多个艺术家演奏。这是多对多的关系。在我的 SQL 模型中,我有一个assoc_artists_genres
表,如果具有 id 的艺术家2
在流派3
和中播放5
,我将值 (2,3) 和 (2,5) 插入到 assoc 表中。简单的。
但是对于 Sequelize,我感到很困惑。根据这个答案,这样做的方法是belongsToMany()
在两个模型中实现。
这究竟是如何工作的?我已经在
.associate
模型的一部分中添加了它,但是我从这里去哪里,如何添加关联?如果我想添加艺术家
2
在流派中播放3
,5
我是否必须更新艺术家对象和流派对象?这不是很多余吗?如果我用两种流派更新了艺术家对象,但我没有用艺术家更新流派对象,会发生什么?
我应该也使用 assoc 表(就像文档中建议的那样)还是不使用 assoc 表并belongsToMany()
按照链接答案中的建议放入每个模型?
我尝试添加关联模型 ( Artists_Genres
),但我应该在单个模型中还是在关联模型中添加关联?那么 assoc 模型是空的吗?
使用我的模型编写代码:
models/artist.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var Artist = sequelize.define('Artist', {
name: DataTypes.STRING,
description: DataTypes.TEXT,
picture: DataTypes.TEXT
}, {});
Artist.associate = function(models) {
Artist.belongsToMany(models.Genre, {
through: 'Artist_Genre',
foreignKey: 'Artist_id',
});
};
return Artist;
};
models/genres.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var Genre = sequelize.define('Genre', {
name: DataTypes.STRING
}, {});
Genre.associate = function(models) {
Genre.belongsToMany(models.Artist, {
through: 'Artist_Genre',
foreignKey: 'Genre_id',
});
};
return Genre;
};
models/artist_genre.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var Artist_Genre = sequelize.define('Artist_Genre', {
Artist_id: DataTypes.INTEGER,
Genre_id: DataTypes.INTEGER
}, {});
Artist_Genre.associate = function(models) {
// associations can be defined here
//Should I add anything here?
};
return Artist_Genre;
};
我认为我现在缺少的部分在 Artist 控制器中。我想使用artist_id
和为艺术家分配流派genre_id
。我的控制器如下所示:
const Artist = require('../models').Artist;
const Genre = require('../models').Genre;
module.exports = {
create(req, res) {
return Artist
.create({
name: req.body.name,
description: req.body.description,
picture: req.body.picture,
})
.then(artist => res.status(201).send(artist))
.catch(error => res.status(400).send(error));
},
list(req,res) {
return Artist
.all()
.then(artists => res.status(200).send(artists))
.catch(error => res.status(400).send(error));
},
addGenre(req,res) {
// ?
},
};
解决方案
推荐阅读
- java - XmlElement 在 SOAP 中显示为小写
- android - 在技术上是否可以阻止用户更改原始启动器?
- wcf - SoapUI 对序列模式断言是否过于严格?
- python - 如何在 Python 中访问我的 JSON 中的元素?
- c++ - 自动展开 qtreeview 中委托的 qcombobox
- node.js - 从 Node.js 中的 SerialPort 读取浮点数据
- angularjs - 日期选择器图标无法找到并单击它
- flutter - 如何在不影响后台内容的情况下弯曲底部导航栏角?扑
- reactjs - 在Textfield material-ui中选择props
- validation - 上传篡改的pdf文件时,如何在角度10中捕获“无法加载pdf文档”