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

时间:2017-08-30 06:28:28

标签: javascript node.js postgresql sequelize.js

我有两个型号品牌广告系列

品牌可以包含多个广告系列

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
}

如果我想通过品牌 获取广告系列。我该怎么办? 我已经尝试了查询喜欢提到的文档,但它对我不起作用

  

使用Belongs-To-Many,您可以根据关系进行查询并选择特定属性。例如,使用findAll with through

     

User.findAll({     包括:[{       型号:项目,       通过:{         属性:[' createdAt',' startedAt',' finishedAt'],         其中:{completed:true}       }     }]   });

我找到了一些解决方法,但这不是我想要的:

解决方案1:

belongsToMany 品牌更新为 hasMany CampaignBrand 以及 CampaignBrand.brand

解决方案2:

通过查询品牌

获取广告系列

还有其他任何建议吗?

方言: postgres

数据库版本: 9.4

Sequelize版本: 4.2.1

1 个答案:

答案 0 :(得分:0)

我认为你在通过模型中不需要这种关联:

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

您已经在Brand和Campaign的定义中拥有belongsToMany关联,因此我认为您只需要使用status和roleText属性创建CampaignBrand模型。

据我了解,您可以通过广告系列查询品牌,并且应该返回每个品牌元素及其相关广告系列

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