2017-08-30 2 views
0

J'ai deux modèles Marque et campagne.Sequelize belongsToMany obtenir le modèle source en interrogeant le modèle cible

A Marque peut avoir de nombreuses campagnes

export default(sequelize, DataTypes)=> { 
    const Brand = sequelize.define('Brand', { 
    id: { 
     type: DataTypes.UUID, 
     defaultValue: DataTypes.UUIDV4, 
     primaryKey: true, 
    }, 
}) 

Brand.associate = models=> { 
    Brand.belongsToMany(models.Campaign, { 
     through: models.CampaignBrand, 
     foreignKey: 'brand', 
    }) 
} 

return Brand 
} 

A Campagne peut aussi avoir beaucoup Marque

export default(sequelize, DataTypes)=> { 
    const Campaign = sequelize.define('Campaign', { 
    id: { 
     type: DataTypes.UUID, 
     defaultValue: DataTypes.UUIDV4, 
     primaryKey: true, 
    }, 
}) 

Campaign.associate = models=> { 
    Campaign.belongsToMany(models.Brand, { 
     through: models.CampaignBrand, 
     foreignKey: 'campaign', 
    }) 
} 

return Campaign 
} 

Et est par modèle ici:

export default(sequelize, DataTypes)=> { 
    const CampaignBrand = sequelize.define('CampaignBrand', { 
    // see enums 
    status: { 
     type: DataTypes.INTEGER, 
     allowNull: false, 
    }, 
    roleText: { 
     type: DataTypes.STRING, 
    }, 
    }) 

    CampaignBrand.associate = models=> { 
    CampaignBrand.belongsTo(models.Campaign, { 
     foreignKey: 'campaign', 
     targetKey: 'id', 
     onDelete: 'CASCADE', 
    }) 
    } 

    return CampaignBrand 
} 

Si je veux obtenir campagnes par marque. Que devrais-je faire? J'ai essayé requête aime document mentionné, mais il ne fonctionne pas pour moi

Avec Appartient-To-Many vous pouvez interroger sur la base par rapport et sélectionnez des attributs spécifiques. Par exemple en utilisant findAll avec par

User.findAll ({ comprennent: [{modèle : Projet, par: { attributs: [ 'createdAt', 'startedAt', 'finishedAt'], où : { achevé: vrai} } }] });

J'ai trouvé des façons de contourner, mais ce n'est pas ce que je cherche:

SOLUTION 1:

Mise à jour belongsToManyMarque à hasManyCampaignBrand et la requête par CampaignBrand.brand

SOLUTION 2:

Obtenez Campagne en questionnant Marque

Tous les autres conseils?

Dialect: postgres

version de base de données: 9.4

version Sequelize: 4.2.1

Répondre

0

Je pense que vous n'avez pas besoin de cette association dans le traversantes modèle:

CampaignBrand.associate = models=> { CampaignBrand.belongsTo(models.Campaign, { foreignKey: 'campaign', targetKey: 'id', onDelete: 'CASCADE', }) }

Vous avez déjà l'association belongsToMany dans les définitions de la marque et la campagne, donc je pense que vous avez juste besoin créez le modèle CampaignBrand avec vos attributs status et roleText.

Si je comprends bien, vous pouvez demander des marques à travers des campagnes et il devrait retourner chaque élément de la marque et ses campagnes associées,

Brand.findAll({ include: [{ model: Campaign }] });