Sequelize:Include.where按'父'模型属性过滤

San*_*ojo 11 javascript sequelize.js

我有两个相关的模型,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'});
Run Code Online (Sandbox Code Playgroud)

我正在尝试包含与Catalog相关的ProductCategory表中的一些信息,但仅限于language_id匹配时.

目前我正在从两张桌子上得到所有可能的比赛.这是现在的查询:

Catalog.find({where:
    {id: itemId},
    include: {
        model: models.ProductCategory, 
        where: {language_id: /* Catalog.language_id */}
    }
})
Run Code Online (Sandbox Code Playgroud)

有没有办法使用Catalog中的属性来过滤两个模型具有相同语言的包含?

顺便说一下,我也尝试过改变那里没有任何后果:

where: {'ProductCategory.language_id': 'Catalog.language_id'}
Run Code Online (Sandbox Code Playgroud)

Fre*_*mer 21

Sequelize $col为这种情况提供了额外的操作符,因此您不必使用sequelize.literal('...')(这更像是一个黑客).

在您的示例中,用法如下所示:

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

  • 记得包含 const Sequelize = require('sequelize'); const Op = Sequelize.Op; 你可以 [Op.col] 而不是 $col 为我修复它 (4认同)
  • 经过测试,像魅力一样工作,感谢您对我的自我回答的改善。;) (2认同)
  • 这只会为我返回 [Object object] (2认同)

Har*_*rsh 11

你可以试试这个(特别是如果你使用的是 MariaDB) -

const Sequelize = require('sequelize'); 
const op = Sequelize.Op;

Catalog.find({where:
    {id: itemId},
    include: {
        model: models.ProductCategory, 
        where: {
          language_id: {[op.col]: 'Catalog.language_id'}
        }
    }
})
Run Code Online (Sandbox Code Playgroud)


San*_*ojo 5

这似乎可以解决问题:

where: {language_id: models.sequelize.literal('Catalog.language_id')}
Run Code Online (Sandbox Code Playgroud)