簡體   English   中英

通過查詢目標模型來使belongsToMany獲得源模型

[英]Sequelize belongsToMany get source model by querying on target model

我有兩個模型BrandCampaign

一個品牌可以有多個廣告系列

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
}

如果我想按品牌 獲得Campaigns 我該怎么辦? 我已經嘗試過查詢喜歡提到的文檔,但是它對我不起作用

使用“多對多”,您可以基於直通關系進行查詢並選擇特定的屬性。 例如,將findAll與through一起使用

User.findAll({包括:[{模型:項目,通過:{屬性:['createdAt','startedAt','finishedAt'],其中:{completed:true}}}]}}));

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

解決方案1:

belongsToMany Brand更新為hasMany CampaignBrand,並通過CampaignBrand.brand查詢

解決方案2:

通過查詢品牌獲取廣告系列

還有其他建議嗎?

方言: postgres

數據庫版本: 9.4

續集版本: 4.2.1

我認為您在直通模型中不需要此關聯:

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

您已經在Brand和Campaign的定義中擁有了EmiratesToMany關聯,因此我認為您只需要使用status和roleText屬性創建CampaignBrand模型。

據我了解,您可以通過廣告系列查詢品牌,並且它應該返回每個品牌元素及其關聯的廣告系列,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM