web-dev-qa-db-fra.com

Sequelize: filtrage Include.where par un attribut de modèle «parent»

J'ai deux modèles liés, Catalogue et ProductCategory. Ce dernier a un PK composé, 'id, id_langue'. Voici les modèles simplifiés:

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'});

J'essaie d'inclure des informations de la table ProductCategory liées au catalogue, mais UNIQUEMENT lorsque le language_id correspond.

En ce moment, je reçois toutes les correspondances possibles des deux tables. Voici la requête en ce moment:

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

Existe-t-il un moyen d'utiliser un attribut du catalogue pour filtrer l'inclusion lorsque les deux modèles ont le même langage?

Soit dit en passant, j'ai également essayé de changer le caluse où, sans aucune conséquence:

where: {'ProductCategory.language_id': 'Catalog.language_id'}
14

Sequelize fournit un opérateur supplémentaire $col Pour ce cas, vous n'avez donc pas besoin d'utiliser sequelize.literal('...') (qui est plus un hack).

Dans votre exemple, l'utilisation ressemblerait à ceci:

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

Cela semble faire l'affaire:

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

Vous pouvez essayer ceci (surtout si vous utilisez 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