2016-05-20 3 views
0

У меня есть много-много отношений между тегами и историями в моей базе данных. Я хотел бы отфильтровать истории тех, у кого есть определенный тег, однако я хотел бы включить все теги истории в результирующий набор. Как я могу это сделать?Sequelize: M2M Фильтровать объекты, у которых нет метки

В настоящее время мой запрос возвращает только один тег (тег, который используется как фильтр) с каждой историей. Я хочу, чтобы он включал все теги данной истории.

Relation

Это мой текущий запрос.

 models.Story.findAll({ 
      attributes: ['id', 'title', 'description'], 
      include: [ 
       { 
        attributes: ['name', 'description'], 
        model: models.Tag, 
        where: { 
         id: tag.id 
        }, 
        order: [['useCount', 'desc']] 
       }, 
       { 
        attributes: ['id', 'displayName'], 
        model: models.User, 
        where: { 
         id: models.sequelize.col('User.id') 
        } 
       } 
      ] 
     }) 

ответ

1

Предполагая, что ваши отношения моделируются как

models.users.hasMany(models.stories); 

models.stories.belongsTo(models.users); 
models.stories.belongsToMany(models.tags, { 
    through: 'story_tags' 
}); 
models.stories.hasMany(models.story_tags); 

models.tags.belongsToMany(models.stories, { 
    through: 'story_tags' 
}); 
models.tags.hasMany(models.story_tags); 

models.story_tags.belongsTo(models.stories); 
models.story_tags.belongsTo(models.tags); 

Тогда вот что вы можете сделать:

models.stories.findAll({ 
    attributes: ['id', 'title', 'description'], 
    include: [{ 
     model: models.tags, 
     attributes: ['id'], 
     where: { 
      id: tag.id 
     } 
    }, { 
     model: models.users, 
     attributes: ['id', 'displayName'], 
     where: { 
      id: { 
       $col: 'user.id' 
      } 
     } 
    }, { 
     model: models.story_tags, 
     attributes: ['id'], 
     include: [{ 
      model: models.tags, 
      attributes: ['name', 'description'] 
     }] 
    }] 
}).then(stories => { 
    // The rest of your logics here... 
});