【问题标题】:Sequelize - N:M Association Count Number of Included Model with ConditionSequelize - N:M Association Count Number of Included Model with Condition
【发布时间】:2020-11-12 15:26:05
【问题描述】:

我有两个模型:ArticlesTags。这些模型通过belongsToMany相互关联,所以一篇文章可能有很多标签,标签可以被很多文章使用。

模型

Articles.belongsToMany(Tags, {
    foreignKey: 'articleId', 
    as: 'tags', 
});

Tags.belongsToMany(Articles, {
    foreignKey: 'tagId', 
    as: 'articles', 
});

查询时,我需要获取以searchTag为标签的文章,但获取与文章相关的所有标签信息。

我尝试的是:

const articles = await Articles.findAll({
    include: [{
        model: Tags, 
        as: 'tags', 
        where: {
            tag: searchTag, 
        }, 
        attributes: ['id', 'tag'], 
        required: true, 
    }], 
    where: { 
        // querying condition
    }, 
});

但是这段代码只获取到匹配的标签,无法获取到属于该文章的所有标签

我认为的另一个解决方案是检查tag=searchTag 是否存在于tags 中的任何标签,但我不知道如何将此条件放入sequelize 对象中。将这种条件适合 sequelize 对象的正确方法是什么?或者除了获取所有具有searchedTag 的文章的ids 并获取基于ids 的所有文章之外的任何其他方式来解决此问题?

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    您必须在顶部 where 子句中查询您的 searchTag。

    const articles = await Articles.findAll({
        include: [{
            model: Tags, 
            as: 'tags', 
            // where: {
            //    tag: searchTag, 
            // }, 
            attributes: ['id', 'tag'], 
            required: true, 
        }], 
        where: { 
           $tags.id$': searchTag // <-- New
        }, 
    });
    

    通过在包含部分中进行查询,您只会获得您在帖子中描述的过滤标签。

    【讨论】:

    • 我以前试过这个,但我得到了Unknown column 'tags.id' in 'where clause' 错误。我认为这是因为它是多对多关系,而不是一对多。
    • 我也试过了,但是标签还是被过滤掉了。
    猜你喜欢
    • 2020-10-30
    • 2022-12-21
    • 1970-01-01
    • 2018-11-06
    • 2022-12-01
    • 1970-01-01
    • 2017-06-10
    • 2022-12-27
    • 2012-01-04
    相关资源
    最近更新 更多