Подтвердить что ты не робот

Можно ли отфильтровать запрос по атрибутам в таблице ассоциаций с sequelize?

Я пытаюсь отфильтровать свой запрос по атрибутам таблицы соединения

У меня есть 2 таблицы Города и категории, которые я связываю через третью таблицу 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) {
        ...
    });

К сожалению, я не уверен, как сказать, что использовать атрибут 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) {
    ...
  });
4b9b3361

Ответ 1

При запросе сквозной таблицы вы должны использовать through.where

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

Возможно, вы захотите добавить required: true, чтобы включить include во внутреннее соединение

Ответ 2

Для Sequelize v3 кажется, что синтаксис ближе к тому, что вы предложили, то есть:

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