Sequelize哪里没有

时间:2015-07-14 03:45:51

标签: node.js sequelize.js

我有一个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'的文章可以包含translatedArticlestype = 'translated'。{/ p>

现在,我想查询所有没有翻译的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)')
});

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

也许我已经找到了解决方案,请使用 subQuery: false,文档中没有此选项。

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

答案 2 :(得分:0)

我在这里脱颖而出,但我认为这就是它的实现方式:

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