首页 文章

Sequelize哪里没有

提问于
浏览
28

我有一个 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 文章 .

基于an issue at the Sequelize project 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)')
});

2 回答

  • 0

    我在这里不知所措,但我认为这是如何实现的:

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

    我不知道你在后端使用什么数据库技术,但我猜它是区分大小写的 . 我相信它并没有找到该领域,因为你需要将翻译的文章中的t大写 . 这应该工作:

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

相关问题