如何查询自定义连接表

时间:2016-03-06 12:11:39

标签: postgresql sequelize.js

我有三个模型usertabsubscription。用户可以订阅许多标签,标签可以有很多订阅者。 user --* subscription *-- tab

navicat的图表

enter image description here

sequelize.define('subscription', {})

Tab.belongsToMany(User, { through: Subscription })
User.belongsToMany(Tab, { through: Subscription })

如何获取特定标签的所有订阅者或特定用户订阅的所有标签? 我可以在两个查询中执行此操作,但必须在一个查询中。

我尝试了whereincludethrough的所有可能组合,我不想在此分享。每当我尝试从任何一方访问订阅时,我都会subscription (subscriptions) is not associated to user

我试图让这样的事情发挥作用。

  await Tab.findAll({
    where: { name: ctx.params.tabname },
    include: [{
      model: Subscription,
      through: {
        where: { userUsername: ctx.params.username }
      }
    }]
  })

1 个答案:

答案 0 :(得分:2)

belongsToMany的问题是直接创建到目标实体的链接。因此,要获得特定选项卡的所有用户,您必须执行

Tab.findAll({
 include: [{
    model: User
  }]
});

当您不想从订阅实体获取任何数据时,这是有效的。

如果您想从订阅实体中选择任何数据,则需要稍微修改您的关系。

Tab.hasMany(Subscription);
Subscription.belongsTo(Tab);

User.hasMany(Subscription);
Subscription.belongsTo(User);

这将创建从制表符到订阅的一对多关系,并添加从订阅到制表符的向后绑定。对用户来说也是一样。

然后,您可以查询特定选项卡的所有订阅(包含用户信息),或查询特定用户的所有订阅(使用选项卡信息),如下所示:

Tab.findAll({
  include: [{
    model: Subscription,
    include: [{
      model: User
    }]
  }]
});

User.findAll({
  include: [{
    model: Subscription,
    include: [{
      model: Tab
    }]
  }]
});

我希望有所帮助!