2つのモデルに関連する、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'});
Catalogに関連するProductCategoryテーブルからいくつかの情報を含めようとしていますが、language_idが一致する場合のみです。
現時点では、両方のテーブルから可能なすべての一致を取得しています。これが今のクエリです:
Catalog.find({where:
{id: itemId},
include: {
model: models.ProductCategory,
where: {language_id: /* Catalog.language_id */}
}
})
両方のモデルが同じ言語であるインクルードをフィルターするためにカタログの属性を使用する方法はありますか?
ちなみに、私は何の心配もなく、場所の場所を変更しようとしました:
where: {'ProductCategory.language_id': 'Catalog.language_id'}
Sequelizeは、この場合に追加の演算子_$col
_を提供するため、sequelize.literal('...')
を使用する必要はありません(これはハックです)。
あなたの例では、使用法は次のようになります:
_Catalog.find({where:
{id: itemId},
include: {
model: models.ProductCategory,
where: {
language_id: {$col: 'Catalog.language_id'}
}
}
})
_
これはこれでうまくいくようです:
where: {language_id: models.sequelize.literal('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'}
}
}
})