首页 > 解决方案 > Sequelize 中的关联表对我来说毫无意义(多对多)

问题描述

我正在尝试学习如何使用 Sequelize,而且我是 ORM 的新手,而关联的概念让我非常困惑,这让我考虑回到 SQL。

我有一张Artists桌子和一张Genres桌子。一位艺术家可以演奏多种流派,并且流派可以由多个艺术家演奏。这是多对多的关系。在我的 SQL 模型中,我有一个assoc_artists_genres表,如果具有 id 的艺术家2在流派3和中播放5,我将值 (2,3) 和 (2,5) 插入到 assoc 表中。简单的。

但是对于 Sequelize,我感到很困惑。根据这个答案,这样做的方法是belongsToMany()在两个模型中实现。

我应该也使用 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) {
    // ?
  },
};

标签: sequelize.js

解决方案


推荐阅读