使用sequelize建立mySQL数据库中多对多关系出现报错,且不知道怎么关联查询。

问题描述

我目前使用的是egg.js+sequelize+mySQL。需求是给出前端个人收藏页文章列表数据,也就是找某一个人收藏的所有文章。想做文章表和前台用户表的多对多关联,并进行查询,但是在关联的时候出现报错:

AssociationError [SequelizeAssociationError]: article.belongsToMany(user) requires through option, pass either a string or a model

问题出现的环境背景及自己尝试过哪些方法

我猜大概是through后面的第三张表写错了,但是加引号不加引号,大写小写都试了一遍,报错没有消失。

相关代码

用户表:

'user strict';

module.exports = app => {
  const { STRING } = app.Sequelize;
  
  const User = app.model.define('user', {
    username: STRING(30)
  }
  );
  
  User.associate = function () {
    app.model.User.belongsToMany(app.model.Article, { through:app.model.ArticleCollection, foreignKey: 'user_id' });
  };
  return User;
};

文章表:

'user strict';

module.exports = app => {
  const { STRING } = app.Sequelize;
  
  const Article = app.model.define('article', {
    title: STRING(30)
  }
  );
  
  Article.associate = function () {
    app.model.Article.belongsToMany(app.model.User, { through:app.model.ArticleCollection, foreignKey: 'article_id' });
  };
  return Article;
};

关联表:

'user strict';

module.exports = app => {
  const ArticleCollection = app.model.define('articleCollection', {}, { timestamps: true});
  
  return ArticleCollection;
);

你期待的结果是什么?实际看到的错误信息又是什么?

我希望能够建立user和article多对多的关系,并且查询某个userId下,收藏的文章列表,这里我有一个疑惑,就是我需要的数据并不仅仅是文章ID,而是需要一个文章的内容列表,这样给到前端就可以直接用上。那我是需要在article表里执行查询吗?谢谢各位大佬!

阅读 3.6k
1 个回答

已经解决了。
1.文章表(article):

app.model.Article.belongsToMany(app.model.User, { through: app.model.Collection, foreignKey: 'article_id' })

2.用户表(user):

app.model.User.belongsToMany(app.model.Article, { through: app.model.Collection, foreignKey: 'user_id' })

3.关联表(collection):
不用写关联的语句,定义好article_id和user_id.
4.找到某一位用户下收藏的所有文章列表:
service层user.js:

async find(id) {
  const { ctx } = this;
  const user = await ctx.model.User.findByPk(id, {
    include: [
      {
        model: ctx.model.Article
      }
    ]
  });
  return user;
}

*在这个过程中如果不小心还有可能发生is not associated with错误,这里是解决办法:Sequelize belongsToMany关系的使用及 is not associated with 问题的处理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题