首页 > 解决方案 > 使用 Sequelize 在多个表之间创建“多对多”关系

问题描述

我在 MSSQL 中有一个已经存在的模式(下图),
我有一个搜索表,每个搜索由一些元数据和 3 种类型的过滤器组成(每个搜索可以是多个),我有一个“多到许多”表将所有类型的过滤器连接到搜索。
我想使用 Sequelize 查询我的搜索并获取每个过滤器,但我找不到任何方法将多个过滤器连接到我的搜索表以使用连接表(过滤器)建模

数据库设计

搜索:包含搜索的元数据和搜索 ID。
过滤器:包含搜索 id 并匹配它以使用过滤器 id 和过滤器类型进行过滤(枚举:“范围”、“日期时间”、“精确”)。
范围过滤器、日期时间过滤器、精确过滤器:过滤器本身及其信息。

如果不可能一起查询它们,我认为在这些表上创建一个视图并在 Sequelize 中为它创建一个模型可能是可能的(但效率可能较低),但我不确定我能做到这一点也是。

是否可以按照我想要的方式建模?如果是,我该如何创建这种连接?
谢谢!

标签: javascriptnode.jssql-servertypescriptsequelize.js

解决方案


在 Sequelize 中,当您在中间表中具有除外键以外的其他属性时,您也必须定义其模型。
根据上述模式,您必须拥有所有表的模型,包括中间表(过滤器)。 以这种方式分配关联:

//associations from search model
SearchesModel.belongsToMany(RangesFiltersModel, {through: FiltersModel, foriegnKey: 'filter_search_id', otherKey: 'filter_id'});
SearchesModel.belongsToMany(ExactFiltersModel, {through: FiltersModel, foriegnKey: 'filter_search_id', otherKey: 'filter_id'});
SearchesModel.belongsToMany(DatetimeFiltersModel, {through: FiltersModel, foriegnKey: 'filter_search_id', otherKey: 'filter_id'});

//associations from filters
RangesFilterModel.belongsToMany(SearchesModel, {through: FiltersModel, foreignKey: 'filter_id', otherKey: 'filter_search_id'});
ExactFilterModel.belongsToMany(SearchesModel, {through: FiltersModel, foreignKey: 'filter_id', otherKey: 'filter_search_id'});
DatetimeFilterModel.belongsToMany(SearchesModel, {through: FiltersModel, foreignKey: 'filter_id', otherKey: 'filter_search_id'});

现在,假设我有一个搜索对象:

search.getRangesFilterModels({through: {filterType: 'range'}});
search.getDatetimeFilterModels({through: {filterType: 'datetime'}});
search.getExactFilterModels({through: {filterType: 'exact'}});

当您要检索每个对象包含所有关联过滤器的所有搜索对象时,您可以这样查询:

SearchesModel.findAll({
    include: [{
        ExactFilterModel,
        through: {filterType: 'exact'}
    }, {
        DatetimeFilterModel,
        through: {filterType: 'datetime'}
    }, {
        RangesFilterModel,
        through: {filterType: 'range'}
    }]
});

PS 确切的代码可能不起作用,但概念是相同的。希望这会对你有所帮助。有关更多信息,请点击参考参考中的链接:Sequelize Associations


推荐阅读