2016-03-06 56 views
0

我有三种型号user,tab,subscription。用户可以订阅很多标签,标签可以有很多订阅者。 user --* subscription *-- tab如何查询自定义连接表

从Navicat的图

enter image description here

sequelize.define('subscription', {}) 

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

如何获取特定标签或所有用户的哪些特定的用户订阅的所有标签? 我可以在两个查询中做到这一点,但它必须在一个可能。

我试过where,include,through的每种可能的组合,我不想在这里分享。每次我尝试从任何一方获得订阅时,我都会收到subscription (subscriptions) is not associated to user

我想让这样的工作。

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

请提供输入和预期输出,并提供表格之间的关系。 – sagi

+0

因此,给定一个标签,你想要列出订阅了原始标签的用户也订阅的所有其他标签页? – rotten

+0

@rotten标签是按名称标识的,所以如果我按名称查询标签,我想知道它的所有订阅者。或者从另一方面来说,用户是通过用户名来标识的,所以如果我通过用户名查询用户我想知道他订阅的所有标签 – Hnus

回答

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 
    }] 
    }] 
}); 

我希望帮助!

+0

非常好,非常感谢我解决了我的问题。 – Hnus