我正在努力学习如何使用Sequelize,我是ORM的新手,关联的概念对我来说非常混乱,这让我想到回到SQL。
我有一个Artists
表和一个Genres
表。艺术家可以演奏多种类型,并且不止一个艺术家可以播放流派。这是一对多关系。在我的SQL模型中,我有一个assoc_artists_genres
表,如果标识为2
的艺术家在类型3
和5
中播放,我会插入值(2,3)和(2,5)在关联表中。简单。
但是对于Sequelize,我很困惑。根据{{3}},执行此操作的方法是在两个模型中实施belongsToMany()
。
这是如何运作的?我在模型的.associate
部分添加了这个,但是我从哪里开始,我该如何添加关联?
如果我想添加艺术家2
在流派3
和5
中播放,我是否必须更新艺术家对象和流派对象?这不是很多余吗?
如果我用两种类型更新艺术家对象会发生什么但我不会用艺术家更新类型对象?
我是否也应该使用一个关联表(就像它在this answer中建议的那样)或者只是不使用关联表并在每个模型中放置belongsToMany()
,如链接答案中建议的那样?
我尝试添加关联模型(Artists_Genres
),但是我应该在单个模型中还是在关联模型中添加关联?那么关联模型是空的吗?
我的模特代码:
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) {
// ?
},
};