2017-02-06 13 views
1

Sequelizeで多対多の設定で問題が発生しました。ここでは、site_article_keyword is not associated to article_keywordという文句があります。以下のコードは、私が間違っていることを理解しようとする最小限のテストケースを表しています(私は小さなものを提供することを望みましたが、これは私のものです)。私はPromise APIにbluebirdを使用しています。エントリを関連付けようとすると「多くの人から多数の人が失敗しました」というメッセージが表示されます。

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 }); 

これは、ソースと宛先のエントリを作成しようとしたときに定義されたモデルで、関連付ける必要があります。

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」の例に私のコードを基づかています:失敗は、私はArticleKeyword.findAll()を呼び出す行で発生します。

誰でも私が間違っていることを示唆することはできますか?

答えて

1

関係を通じてでは、次のは、

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

これは私に同じエラーを与えています。 –

+0

この1つの「site_article_keywordはarticle_keywordに関連付けられていません」 –

+0

はい、私は答えを見つけたと思いました。答えを詳述します。 –

1

を動作するはずの問題は、それが関連であるため、site_article_keywordが関連付けられていない理由があることが判明します!このことを念頭に置いてのコードは次のようになります。

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

自分のコードにBTW 1つのマイナーな微調整、belongsToManyへ「など」を含めることである:

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

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

これはaddArticleKeyword()の代わりaddArticle_Keyword()することができます。