在子数组上使用“where”和“in”时出现续集错误
Posted
技术标签:
【中文标题】在子数组上使用“where”和“in”时出现续集错误【英文标题】:Sequelize error when using "where" and "in" on a subarray 【发布时间】:2014-09-15 05:23:06 【问题描述】:这是我的模型定义:
var Tag = sequelize.define('Tag',
name: Sequelize.STRING
);
var Event = sequelize.define('Event',
name: Sequelize.STRING,
);
Event.hasMany(Tag, as: 'tags', through: 'event_tags', foreignKey: 'eventId');
Tag.hasMany(Event, as: 'events', through: 'event_tags', foreignKey: 'tagId');
换句话说,就是:有事件和标签。事件被标记了许多标签。
我正在尝试运行此查询:
Event
.findAndCountAll(
include: [model: Tag, as: 'tags'],
where: 'tags.id': in: [1,2,3,4],
order: order,
limit: pageSize,
offset: pageSize * (page - 1),
)
.success(function(result)
...
);
但我收到此错误:
\node_modules\sequelize\lib\dialects\abstract\query-generator.js:1134
var logicResult = Utils.getWhereLogic(logic, hash[key][logic]);
^
TypeError: Cannot read property 'in' of undefined
我做错了什么?
我之前用过“in”表达式,例如这里:
Tag
.find(
where: id: in: [1,2,3,4]
).success(...)
而且效果很好。
尽管如此,我从来没有将 in 表达式与子数组一起使用,就像在这种情况下一样。所以我不知道这是否是正确的做法。
【问题讨论】:
【参考方案1】:我知道这已经很老了。但我很确定您要寻找的内容如下。至少其中一个应该可以解决问题。大概两者兼而有之。我目前无法测试,因为我正处于一个 43 文件更改的意大利面条代码野兽中间。有时间我会用实际测试更新。
(我现在发帖是因为其他人似乎并没有真正回答所提出的问题,但他们确实回答了我到达这里时提出的问题。)
Event
.findAndCountAll(
include: [model: Tag, as: 'tags'],
where:
tags:
id: in: [1,2,3,4]
,
order: order,
limit: pageSize,
offset: pageSize * (page - 1),
)
.success(function(result)
...
);
Event
.findAndCountAll(
include: [
model: Tag,
as: 'tags',
where: id: in: [1,2,3,4] ,
],
order: order,
limit: pageSize,
offset: pageSize * (page - 1),
)
.success(function(result)
...
);
【讨论】:
【参考方案2】:Sequelize v5 的更新示例:
await Tag.findAll(
where:
id:
[Sequelize.Op.in]: [1, 2, 3, 4]
);
【讨论】:
只要确保它是static
方法而不是对象可访问的方法。
值得注意的是Shorthand syntax for Op.in section,例如:id: [1,2,3] // Same as using id: [Op.in]: [1,2,3]
【参考方案3】:
in
属性可以在 4.42 版本中使用
Tag.findAll(
where: id: in: [1,2,3,4]
).then(...)
您可以将notIn
属性用于排除值。
Tag.findAll(
where: id: notIn: [1,2,3,4]
).then(...)
http://docs.sequelizejs.com/manual/querying.html#operators
【讨论】:
【参考方案4】:替换为$in
where : id : $in : [1,2,3,4]
【讨论】:
上述贡献者 (Jaddu) 将其答案中的语法与 MongoDB 的类似$in
运算符混淆了。它与 Sequelize 提供的 in
运算符不同,上面 Enxtur 提供的答案完全消除了运算符以支持数组值是问题的正确解决方案。
他们并没有将它与 MongoDB 混淆,他们的答案在 2018 年仍然有些合理。sequelize.org/v4/manual/tutorial/querying.html“出于向后兼容性的原因,Sequelize 默认设置以下别名 - $eq, $ne, $gte , $gt, $lte, $lt, $not, $in, $notIn..." 我在这里寻找其他东西,但它突出了。【参考方案5】:
不需要“in”属性,后续自动定义这个。只需设置数组即可。
Tag.findAll(
where:
id: [1,2,3,4]
).then(...)
【讨论】:
我的问题中的最后一段代码(您正在“修复”的代码)已经可以了。请阅读整篇文章:) Enxtur,我用 findAll 进行了尝试,只有这样才能显示该数组中具有 id 的所有记录。否则,只会显示 id 的值等于数组中第一个元素的值的记录。谢谢您的帮助!这非常有用! Tag.findAll( where: id: [0,1,2,3] ).then( tag => res.json( tag ); ); @Emanuelacolta 这是被误解的问题和错误的答案,导致我的英语不好。但我很高兴它对某人有用:)以上是关于在子数组上使用“where”和“in”时出现续集错误的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:在子选择查询中使用 IN 子句时出现错误
警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱
python:使用pip安装时出现Fatal error in launcher错误
tomcat部署新的项目启动时出现报错信息: Invalid byte tag in constant pool: 15