sequelize.js - 与 WHERE IN ("ARRAY"的 Sequelize 关系)

标签 sequelize.js

是否可以在 sequelize 中定义关系,其中多个外键作为数组存储在一个字段中。基本上是belongsToMany,但不是关系表,所有ID都存储在一个字段中,以逗号分隔。查询将使用 WHERE IN('1,5,7')

最佳答案

你可以做到,但绝对没有外键约束——不可能存储外键数组。但是,您可以创建一个列,该列将是表示关联表 ID 的整数数组。然后你只需要创建一些 instanceMethods 来检索和设置数组值(记住 ARRAY 类型只在 PostgreSQL 中可用)。

我不推荐此解决方案,因为它不能确保数据一致性。让我们考虑一个例子 - 用户属于许多类别,id 为 1、2 和 4。如果删除其中一个类别,您需要记住从用户的 categories 数组中手动​​删除此 id(使用一些 hook 或其他工具) ,否则该用户仍将被分配到不再存在的类别。

const User = sequelize.define('User', {
    categories: DataTypes.ARRAY(DataTypes.INTEGER)
}, {
    instanceMethods: {
        getCategories: function(){
            return Category.findAll({
                where: {
                    id: { $in: this.get('categories') }
                }
            }).then(categories => {
                // if user's categories was [1, 2, 4]
                // it would return categories with id=1, id=2 and id=4
                return categories;
            });
        },
        setCategories: function(ids){
            return this.setDataValues('categories', ids).save().then(self => {
                return self;
            });
        }
    }
});

关于sequelize.js - 与 WHERE IN ("ARRAY"的 Sequelize 关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42719750/

相关文章:

node.js - sequelize 和 postgres 中关联表中的多个值

node.js - TypeError : include. model.getTableName 不是函数

mysql - 如何在 sequelize 中编写嵌套的 select 语句?

node.js - 创建具有关联但没有父实例的新模型

mysql - 通过sequelize添加另一个模型的属性和值

sequelize.js - Sequelize 搜索字段而不是变量

mysql - Express js + Sequelize 查询

mysql - Express session 和 SQL : Can I use the info from connect-session-sequelize to feed a login/logout table?

sequelize.js - sequelize 实例中的 set 和 add 方法有什么区别?

node.js - 如何传入 `app` 以便在 model.js 文件中创建端点?