在子阵列上使用“where”和“in”时的Sequelize错误

时间:2014-07-23 20:34:16

标签: node.js sequelize.js

这是我的模型定义:

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表达式,就像在这种情况下一样。所以我不知道这是不是正确的做法。

5 个答案:

答案 0 :(得分:74)

不需要"在"属性,sequelize auto定义这个。只需设置数组。

Tag.findAll({
    where: {
        id: [1,2,3,4]
    }
}).then(...)

答案 1 :(得分:1)

Sequelize v5的更新示例:

await Tag.findAll({
  where: {
    id: {
      [Sequelize.Op.in]: [1, 2, 3, 4]
    }
  }
});

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我知道这很老了。但我很确定您要寻找的东西如下。其中至少有一个应该可以解决问题。可能两者都有。我目前无法进行测试,因为我处于更改过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) {

    ...
});

答案 4 :(得分:-2)

替换为where : { id : { $in : [1,2,3,4]}}

do
$$
declare
  l_rec record;
  l_stmt text;
begin
  for l_rec in (select schemaname, viewname
                from pg_views
                where schemaname = 'parlgov')
  loop
    l_stmt := format('drop view if exists %I.%I cascade', l_vrec.schemaname, vrec.viewname);
    raise notice 'Dropping %', l_stmt;
    execute l_stmt;
  end loop;
end;
$$
;