【问题标题】:Sequelize where has NOTSequelize where has NOT
【发布时间】:2015-10-02 12:54:50
【问题描述】:

我有一个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)')
});

【问题讨论】:

标签: node.js sequelize.js


【解决方案1】:

我不知道您在后端使用的是什么数据库技术,但我猜它是区分大小写的。我相信它没有找到该字段,因为您需要将已翻译文章中的 t 大写。这应该有效:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我想在这里,但我认为这就是它的实现方式:

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

      【讨论】:

      • 这不会返回任何文章,因为没有任何内容与内部 where 语句匹配。
      • 这个版本会更接近答案吗?
      • 这将返回 SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'TranslatedArticles.translationCount' in 'where clause' 并生成 SQL gist.github.com/tommedema/66e8ae5b715b31c337a9
      • 业余错误!因为这是一个计数,我应该使用 HAVING 而不是 WHERE
      • 运行时,无论是否有其他sourceArticleId等于返回文章的文章,它都会返回文章。因此,这不是所需的行为。我需要返回没有翻译文章的源文章,翻译文章是sourceArticleId等于源文章的文章。生成的SQL是gist.github.com/tommedema/fa400097df063ddf5d75
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2018-02-18
      • 2016-12-17
      • 1970-01-01
      • 2016-02-05
      • 2019-03-13
      • 2017-07-31
      相关资源
      最近更新 更多