記事が相互に関連するArticle
Sequelizeモデルがあります。一部の記事は、他の記事の翻訳されたコピーです。関係は次のように設定されます。
var Article = sequelize.define('Article', {
type : DataTypes.ENUM('source', 'translated'),
sourceArticleId : DataTypes.INTEGER
});
db.Article.hasMany(db.Article, {
foreignKey: 'sourceArticleId',
as : 'TranslatedArticles'
});
したがって、type = 'source'
を含む記事には、多くのtranslatedArticles
が含まれる可能性があります。ここでtype = 'translated'
です。
ここで、翻訳のないすべてのsource
記事をクエリしたいと思います。
Sequelizeプロジェクトgithubの問題 に基づいて、これは次のように実行されます。
Article.findOne({
where: Sequelize.literal('translatedArticles.sourceArticleId IS NULL'),
include: [
{
model: Article,
as : 'TranslatedArticles'
}
]
});
しかし、これを実行すると、次のようになります。
SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'translatedArticles.sourceArticleId' in 'where clause'
また、TranslatedArticles.sourceArticleId
、articles.sourceArticleId
、Articles.sourceArticleId
などの名前のバリエーションも試しました。
私は何かが足りないのですか?
次のように、リテラルのNOT EXISTSクエリを使用して、この問題を一時的に回避することに注意してください。
Article.findOne({
where: Sequelize.literal('NOT EXISTS (SELECT id FROM Articles WHERE Article.id = Articles.sourceArticleId LIMIT 1)')
});
バックエンドで使用しているデータベーステクノロジはわかりませんが、大文字と小文字が区別されると思います。 translationArticlesでtを大文字にする必要があるため、フィールドが見つからないと思います。これは機能するはずです:
Article.findOne({
where: Sequelize.literal('TranslatedArticles.sourceArticleId IS NULL'),
include: [
{
model: Article,
as : 'TranslatedArticles'
}
]
});
私はここで頭のてっぺんから離れますが、これが達成された方法だと思います:
Article.findOne({
include: [
{
model: Article,
as : 'TranslatedArticles',
attributes: [[models.sequelize.fn('COUNT', 'sourceArticleId'), 'translationCount']]
having: {
translationCount: 0
},
}
]
});