postgresql Sequelize belongsToMany通过查询目标模型获取源模型

bjp0bcyl  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(158)

我有两个模型 * 品牌 * 和 * 活动 *。
一个 * 品牌 * 可以有多个 * 营销活动 *

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

ddrv8njm

ddrv8njm1#

我认为在through模型中不需要这种关联:
Brand.findAll({ include: [{ model: Campaign }] });
您已经在Brand和Campaign的定义中具有belongsToMany关联,所以我认为您只需要创建具有status和roleText属性的CampaignBrand模型。
据我所知,您可以通过活动查询品牌,它应该返回每个品牌元素及其关联的活动,
Brand.findAll({ include: [{ model: Campaign }] });

g6baxovj

g6baxovj2#

这个答案有点老了,但是对于belongstomany关联,你可以使用mixins。
https://sequelize.org/api/v6/class/src/associations/belongs-to-many.js~belongstomany

const campaigns = await CampaignModel.findAll();
const campaignsBrandsModels = await campaigns.getBrandsModels({
        limit:1, 
        through: {where:{pivot_field:'pivot_value'} } // << You want this, i think!
      });

现在,请记住,mixins(get、set、count...)使用屈折变化库设置它们的名称,因此,一种无错误地设置名称(或无需花费大量时间在控制台中搜索名称)的方法是在Association中设置“as”别名

CampaignBrand.belongsToMany(models.Campaign, {
    through: models.CampaignBrand,
    foreignKey: 'brand',
    as: 'BrandsModels' //<<<< This is Super important! at least for easy usage
})

您也可以通过在findAll方法中使用include来实现这一点,但是!
"limit:#“部分将不起作用!(将给予您错误“这只适用于hasMany,因为是单独的:正确”)
我真的希望这能帮助到任何人seya!

相关问题