web-dev-qa-db-ja.com

ない場所を続編する

記事が相互に関連するArticleSequelizeモデルがあります。一部の記事は、他の記事の翻訳されたコピーです。関係は次のように設定されます。

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.sourceArticleIdarticles.sourceArticleIdArticles.sourceArticleIdなどの名前のバリエーションも試しました。

私は何かが足りないのですか?

次のように、リテラルのNOT EXISTSクエリを使用して、この問題を一時的に回避することに注意してください。

Article.findOne({
    where: Sequelize.literal('NOT EXISTS (SELECT id FROM Articles WHERE Article.id = Articles.sourceArticleId LIMIT 1)')
});
28
Tom

バックエンドで使用しているデータベーステクノロジはわかりませんが、大文字と小文字が区別されると思います。 translationArticlesでtを大文字にする必要があるため、フィールドが見つからないと思います。これは機能するはずです:

Article.findOne({
    where: Sequelize.literal('TranslatedArticles.sourceArticleId IS NULL'),
    include: [
        {
            model: Article,
            as   : 'TranslatedArticles'
        }
    ]
});
3
aray12

私はここで頭のてっぺんから離れますが、これが達成された方法だと思います:

Article.findOne({
    include: [
        {
            model: Article,
            as   : 'TranslatedArticles',
            attributes: [[models.sequelize.fn('COUNT', 'sourceArticleId'), 'translationCount']]
            having: {
                translationCount: 0
            },
        }
    ]
});
0
swifty