是否可以使用sequelize通过关联表中的属性过滤查询?

时间:2015-07-28 14:09:45

标签: node.js sequelize.js

我试图通过连接表的属性来过滤我的查询

我有两个表城市和类别,我通过第三个表CityCategory关联。 我们的想法是在CityCategory时获取与城市相关联的类别。year是一个特定的整数。

这是我指定关联的方式:

module.exports = function(sequelize, DataTypes) {
    var CityCategory = sequelize.define('CityCategory', {
        year: {
            type: DataTypes.INTEGER,
            allowNull: false,
            validate: {
                notNull: true
            }
        }
    }, {
        indexes: [{
            unique: true,
            fields: ['CityId', 'CategoryId', 'year']
        }]
    });

    return CityCategory;
};

City.belongsToMany(models.Category, {
                    through: {
                        model: models.CityCategory
                    }
                });

Category.belongsToMany(models.City, {
                    through: {
                        model: models.CityCategory
                    }
                });

这是我目前使用的查询失败:

City.find({
        where: {id: req.params.id},
        attributes: ['id', 'name'],
        include: [{
            model: Category,
            where: {year: 2015},
            attributes: ['id', 'name', 'year']
        }]
    })
    .then(function(city) {
        ...
    });

不幸的是,我不确定如何告诉sequelize使用CityCategory的年属性,而不是搜索名为' year'的属性。在分类模型中......

Unhandled rejection SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'Category.CityCategory.year' in 'where clause'

这可能,还是我必须手动编写自定义查询?

非常感谢提前!

修改

我已经玩了一点,找到了解决方案!这看起来有点乱,所以我确定必须有更好的方法。

City.find({
    where: {id: req.params.id},
    attributes: ['id', 'name'],
    include: [{
      model: Category,
      where: [
        '`Categories.CityCategory`.`year` = 2015'
      ],
      attributes: ['id', 'name', 'year']
    }]
  })
  .then(function(city) {
    ...
  });

2 个答案:

答案 0 :(得分:18)

查询直通表时,应使用through.where

include: [{
  model: Category,
  through: { where: {year: 2015}},
  attributes: ['id']
}]

您可能希望添加required: true以将包含转换为内部联接

答案 1 :(得分:4)

对于Sequelize v3,似乎语法更接近您的建议,即:

include: [{
  model: Category,
  where: {year: 2015},
  attributes: ['id']
}]