Sequelize:Include.where 按 'parent' 模型属性过滤
Sequelize: Include.where filtering by a 'parent' Model attribute
我有两个相关的模型,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 table 的信息,但仅当 language_id 匹配时。
目前我正在从两个 table 中获取所有可能的匹配项。
这是现在的查询:
Catalog.find({where:
{id: itemId},
include: {
model: models.ProductCategory,
where: {language_id: /* Catalog.language_id */}
}
})
有没有办法使用 Catalog 中的属性来过滤两个模型具有相同语言的包含?
顺便说一句,我也尝试过更改 where 子句,但没有任何结果:
where: {'ProductCategory.language_id': 'Catalog.language_id'}
这似乎可以解决问题:
where: {language_id: models.sequelize.literal('Catalog.language_id')}
Sequelize 为这种情况提供了一个额外的运算符 $col
,因此您不必使用 sequelize.literal('...')
(这更像是 hack)。
在您的示例中,用法如下所示:
Catalog.find({where:
{id: itemId},
include: {
model: models.ProductCategory,
where: {
language_id: {$col: 'Catalog.language_id'}
}
}
})
您可以试试这个(特别是如果您使用的是 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'}
}
}
})
或者试试这个:
const models = require("models directory");
{
model: models.ModelName,
where: {
column-name: column-value
}
}
我有两个相关的模型,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 table 的信息,但仅当 language_id 匹配时。
目前我正在从两个 table 中获取所有可能的匹配项。 这是现在的查询:
Catalog.find({where:
{id: itemId},
include: {
model: models.ProductCategory,
where: {language_id: /* Catalog.language_id */}
}
})
有没有办法使用 Catalog 中的属性来过滤两个模型具有相同语言的包含?
顺便说一句,我也尝试过更改 where 子句,但没有任何结果:
where: {'ProductCategory.language_id': 'Catalog.language_id'}
这似乎可以解决问题:
where: {language_id: models.sequelize.literal('Catalog.language_id')}
Sequelize 为这种情况提供了一个额外的运算符 $col
,因此您不必使用 sequelize.literal('...')
(这更像是 hack)。
在您的示例中,用法如下所示:
Catalog.find({where:
{id: itemId},
include: {
model: models.ProductCategory,
where: {
language_id: {$col: 'Catalog.language_id'}
}
}
})
您可以试试这个(特别是如果您使用的是 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'}
}
}
})
或者试试这个:
const models = require("models directory");
{
model: models.ModelName,
where: {
column-name: column-value
}
}