Sequelize:M2M过滤没有标记的实体

时间:2016-05-20 21:14:14

标签: node.js sequelize.js

我的数据库中的标签与故事之间存在多对多的关系。我想过滤具有特定标签的人的故事,但是我想在结果集中包含故事的所有标签。我该怎么做呢?

现在,我的查询只返回每个故事的一个标记(用作过滤器的标记)。我希望它包含给定故事的所有标签。

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 个答案:

答案 0 :(得分: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...
});