web-dev-qa-db-ja.com

Sequelize:「親」モデル属性によるInclude.whereフィルタリング

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'}
14

Sequelizeは、この場合に追加の演算子_$col_を提供するため、sequelize.literal('...')を使用する必要はありません(これはハックです)。

あなたの例では、使用法は次のようになります:

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

これはこれでうまくいくようです:

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

あなたはこれを試すことができます(特に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'}
        }
    }
})
1
itsHarshad