【问题标题】:Sequelize query specific belongsToMany associationSequelize 查询特定的 belongsToMany 关联
【发布时间】:2019-07-17 16:46:23
【问题描述】:

我有一个带有两个表的 Sequelize 设置,FooBar。它们彼此之间都有一个 belongsToMany 关联。

Foo.belongsToMany(Bar, {through: 'foo_bars'});
Bar.belongsToMany(Foo, {through: 'foo_bars'});

现在,我有一些与许多酒吧相关联的 foo。但我有一些特定的酒吧,我想找到与所有这些相关的所有 foo,但只有这些酒吧。

bars = [wineBar, beerBar];
const wineAndBeerBarFoo = await Foo.findAll({
    where: {
        // ?
    },
    include: [{
        model: Bar,
        where: {
            // id: {[Sequelize.Op.all]: [wineBar.id, beerBar.id]}
        }
    }]
});

我尝试了一些变体,但我在 include 块中评论的内容显然不正确,因为它会查找与 ID 是啤酒和葡萄酒酒吧 ID 数组的酒吧相关联的 foos,这是不可能的。

我并没有真正找到一种方法来完成我在文档中寻找的内容。我总是可以手动浏览 FooBars 表,但想知道是否有更惯用的方法来做到这一点。谢谢!

【问题讨论】:

    标签: node.js sequelize.js has-and-belongs-to-many


    【解决方案1】:

    您应该将where 子句添加到through 对象。我试图用Op.all 使用你的条件,但我得到了SequelizeDatabaseError: malformed array literal,所以可能all 条件在我的版本中被破坏(我使用sequelize 5.8.5)。也许尝试一些不同的查询方法(Op.and 也许)。但基本原理是这样的:

    const wineAndBeerBarFoo = await Foo.findAll({
        include: [{
            model: Bar,
            required: true,
            through: {
                    where: {
                        BarId: {[Sequelize.Op.eq]: wineBar.id }
                    }
                }
            }
        ]
    });
    

    【讨论】:

    • 我认为all 条件没有被破坏。相反,问题是我试图通过多个关联查询一个对象。当然,每个单独的关联只有一个 id,但我的查询是断言所有关联的集合与我的 [wineBar.id, beerBar.id] 数组完全匹配。
    • 另一种选择是从 Bar 中删除 through 子句,并在 where 子句中使用 Sequelize 文字为 Foo 与您的 ALL 条件,但我认为这不是所有运算符的正确使用.您可以通过原始选择获得正确的数据吗?
    • 使用原始选择,我可以查询FooBars 表,选择不同的barIds,其中barId 匹配wineBar 或beerBar,按fooId 分组,然后使用barIds 的计数等于 2。
    • 那么为什么不使用与 sequelize 相同的原理呢?只需为 foo_bar 设置一个模型,在 Foo 和 Bar 模型定义中设置一个模型而不是字符串,然后从 FooBar 开始查询(您必须设置从 FooBar 到 Bar 和 Foo 的 hasMany 关联才能使其工作)
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多