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

Sequelize: фильтрация Include.where с помощью атрибута 'parent' Model

У меня есть две модели, связанные, Catalog и ProductCategory. Последний имеет составной PK, 'id, language_id'. Вот упрощенные модели:

var Catalog = sequelize.define("Catalog", {
id: {
  type: DataTypes.INTEGER,
  primaryKey: true,
  autoIncrement: true
},
user_id: {
  type: DataTypes.INTEGER,
  allowNull: false
},
product_category_id: {
  type: DataTypes.STRING(7)
},
language_id: {
  type: DataTypes.INTEGER
},  
... more stuff ...
}

var ProductCategory = sequelize.define("ProductCategory", {
id: {
  type: DataTypes.STRING(7),
  primaryKey: true
},
language_id: {
  type: DataTypes.INTEGER,
  primaryKey: true
},
... more stuff ...
}

Catalog.belongsTo(models.ProductCategory, {foreignKey: 'product_category_id'});

Я пытаюсь включить некоторую информацию из таблицы ProductCategory, относящуюся к каталогу, но ТОЛЬКО при совпадении language_id.

На данный момент я получаю все возможные совпадения из обеих таблиц. Это запрос прямо сейчас:

Catalog.find({where:
    {id: itemId},
    include: {
        model: models.ProductCategory, 
        where: {language_id: /* Catalog.language_id */}
    }
})

Есть ли способ использовать атрибут из каталога для фильтрации включений, если обе модели используют один и тот же язык?

Кстати, я также попытался изменить выражение where без каких-либо последствий:

where: {'ProductCategory.language_id': 'Catalog.language_id'}
4b9b3361

Ответ 1

Sequelize предоставляет дополнительный оператор $col для этого случая, поэтому вам не нужно использовать sequelize.literal('...') (что более опасно).

В вашем примере использование будет выглядеть так:

Catalog.find({where:
    {id: itemId},
    include: {
        model: models.ProductCategory, 
        where: {
          language_id: {$col: 'Catalog.language_id'}
        }
    }
})

Ответ 2

Кажется, это делает трюк:

where: {language_id: models.sequelize.literal('Catalog.language_id')}