Zakładam, że pytasz o sposób wykonania zapytania przez Sequelize. Nie jestem pewien, czy dobrze rozumiem Twoje pytanie. Szukasz dwóch zapytań:
- Przeszukuj wszystkie artykuły obserwowanych użytkowników,
- Zapytaj subskrybowany kraj/tag/artykuł konkretnego użytkownika,
Zacznę od skojarzeń powstałych między modelami.
// in User model definition
User.belongsToMany(User, { as: 'Followers', through: 'Followers', foreignKey: 'userId', otherKey: 'followId' });
User.hasMany(Subscribe, { foreignKey: 'userId' });
User.hasMany(Article, { foreignKey: 'userId' });
Za pomocą powyższego powiązania jesteśmy teraz w stanie wyszukać wszystkie artykuły obserwowanych użytkowników
models.User.findByPrimary(1, {
include: [
{
model: models.User,
as: 'Followers',
include: [ models.Article ]
}
]
}).then(function(user){
// here you have user with his followers and their articles
});
Powyższe zapytanie wygenerowałoby wynik podobny do
{
id: 1,
Followers: [
{
id: 4,
Articles: [
{
id: 1,
title: 'article title' // some example field of Article model
}
]
}
]
}
Jeśli chcesz zapytać o kraj/tag/artykuł zasubskrybowany przez konkretnego użytkownika, musisz utworzyć kolejne powiązania w Subscribe
model
// in Subscribe model definition
Subscribe.belongsTo(Tag, { foreignKey: 'tagId' });
Subscribe.belongsTo(Article, { foreignKey: 'articleId' });
Subscribe.belongsTo(Country, { foreignKey: 'payId' });
Teraz mamy wszystkie powiązania wymagane do wykonania drugiego zapytania, o które prosiłeś
models.User.findByPrimary(1, {
include: [
{
model: models.Subscribe,
include: [ models.Tag, models.Country, models.Article ]
}
]
}).then(function(user){
// here you get user with his subscriptions
});
W tym przykładzie otrzymujesz użytkownika ze wszystkimi jego subskrypcjami dostępnymi przez user.Subscribes
, który będzie miał zagnieżdżone atrybuty Tag
, Country
i Article
. Jeśli użytkownik zasubskrybował Tag
, oba Country
i Article
byłoby NULL
w tym przypadku.