Sequelize where has NOT
Posted
技术标签:
【中文标题】Sequelize 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.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)')
);
【问题讨论】:
你用的是哪个版本的? @yanana 版本 3.3.1 你能打开 SQL 日志看看 sequelize 查询生成器试图查询什么吗? @StevenLu 日志是gist.github.com/tommedema/5f5ad310a3f31b1dccaa 【参考方案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以上是关于Sequelize where has NOT的主要内容,如果未能解决你的问题,请参考以下文章