当尝试关联条目时,将多个到多个故障序列化为“不相关联”?

我与Sequelize多对多的configuration有一个问题,它在那里抱怨site_article_keyword is not associated to article_keyword 。 下面的代码代表了一个最小的testing案例,试图了解我做错了什么(我希望提供更小的东西,但这是我的)。 我正在使用蓝鸟的Promise API。

 const Sequelize = require('sequelize'); var sequelize = new Sequelize(undefined, undefined, undefined, { dialect: 'sqlite', storage: './mydatabase', }); const SiteArticle = sequelize.define('site_article', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, ownerId: { type: Sequelize.INTEGER, field: 'owner_id' }, title: Sequelize.STRING // other fields omitted }, { timestamps: true }); const ArticleKeyword = sequelize.define('article_keyword', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, name: Sequelize.STRING, language: Sequelize.STRING // other fields omitted }, { timestamps: true }); const SiteArticleKeyword = sequelize.define('site_article_keyword', { siteArticleId: { type: Sequelize.INTEGER, field: 'site_article_id', references: { model: SiteArticle, key: 'id' } }, articleKeywordId: { type: Sequelize.INTEGER, field: 'article_keyword_id', references: { model: ArticleKeyword, key: 'id' } } // other fields omitted }, { timestamps: true }); (ArticleKeyword).belongsToMany( SiteArticle, { through: SiteArticleKeyword }); (SiteArticle).belongsToMany( ArticleKeyword, { through: SiteArticleKeyword }); 

这是现在定义的模型,现在试图创build源和目的地条目,然后我想要关联。 在我称为ArticleKeyword.findAll()的行上发生故障:

 sequelize.sync({}).then(function() { // populate some data here let siteArticle; SiteArticle.create({ ownerId: 1, title: 'hello world' }).then(function(entry) { siteArticle = entry; console.log('site article: ', JSON.stringify(entry, undefined, 2)); return ArticleKeyword.findOrCreate({ where: { name: 'keyword1', language: 'en' } }); }).spread(function(entry, success) { console.log('article keyword: ', JSON.stringify(entry, undefined, 2)); return siteArticle.addArticle_keyword(entry); }).spread(function(entry, success) { console.log('site article keyword: ', JSON.stringify(entry, undefined, 2)); const siteArticleId = 1; const language = 'en'; return ArticleKeyword.findAll({ where: { language: language, }, include: [{ model: SiteArticleKeyword, where: { siteArticleId: siteArticleId } }] }); }).then(function(articleKeywords) { if (articleKeywords) { console.log('entries: ', JSON.stringify(articleKeywords, undefined, 2)); } else { console.log('entries: ', 'none'); } }).catch(function(error) { console.log('ERROR: ', error); }.bind(this)); }).catch(function(error) { console.log(error); }); 

我将代码放在Sequelize文档中的“ Mixin BelongsToMany”示例上。

任何人都可以build议我做错了什么?

问题结果是site_article_keyword不相关的原因是因为它是关联! 考虑到这一点,代码变成:

 return ArticleKeyword.findAll({ where: { language: language, }, include: [{ model: SiteArticle, as: 'SiteArticle', siteArticleId: siteArticleId }] }); 

顺便说一句,对我的代码进行小小的调整,就是将“as”包含在belongsToMany中:

 (ArticleKeyword).belongsToMany( SiteArticle, { through: SiteArticleKeyword, as: 'SiteArticle' }); (SiteArticle).belongsToMany( ArticleKeyword, { through: SiteArticleKeyword, as: 'ArticleKeyword' }); 

这允许addArticleKeyword()而不是addArticle_Keyword()

通过关系,以下应该工作

 ArticleKeyword.findAll({ include: [{ model: SiteArticle, through: { attributes: ['createdAt', 'startedAt', 'finishedAt'], where: {siteArticleId: siteArticleId } }] });