我有两个模型 * 品牌 * 和 * 活动 *。
一个 * 品牌 * 可以有多个 * 营销活动 *
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
}
一个 * 商业活动 * 还可以有多个 * 品牌 *
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
}
下面是 * 通过 * 模型:
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
}
如果我想按品牌获取营销活动,我该怎么办?我已尝试查询类似于上述文档的查询,但它对我无效
使用“属于多个”,您可以基于直通关系进行查询并选择特定属性。例如,使用带有直通的findAll
使用者.findAll({包括:[{型号:项目,通过:{属性:['创建时间','开始时间','完成时间'],其中:{已完成:false} } } }] });
我已经找到了一些变通的方法,但这不是我要找的:
解决方案1:
将归属于多个品牌 * 更新为具有多个活动品牌 *,并按 * 活动品牌.品牌 * 进行查询
解决方案2:
通过查询 * 品牌 * 获取 * 活动 *
还有其他建议吗?
**方言:**postgres
**数据库版本:**9.4
**续集版本:**4.2.1
2条答案
按热度按时间ddrv8njm1#
我认为在through模型中不需要这种关联:
Brand.findAll({ include: [{ model: Campaign }] });
您已经在Brand和Campaign的定义中具有belongsToMany关联,所以我认为您只需要创建具有status和roleText属性的CampaignBrand模型。
据我所知,您可以通过活动查询品牌,它应该返回每个品牌元素及其关联的活动,
Brand.findAll({ include: [{ model: Campaign }] });
个g6baxovj2#
这个答案有点老了,但是对于belongstomany关联,你可以使用mixins。
https://sequelize.org/api/v6/class/src/associations/belongs-to-many.js~belongstomany
现在,请记住,mixins(get、set、count...)使用屈折变化库设置它们的名称,因此,一种无错误地设置名称(或无需花费大量时间在控制台中搜索名称)的方法是在Association中设置“as”别名
您也可以通过在findAll方法中使用include来实现这一点,但是!
"limit:#“部分将不起作用!(将给予您错误“这只适用于hasMany,因为是单独的:正确”)
我真的希望这能帮助到任何人seya!