【发布时间】:2019-02-07 15:33:13
【问题描述】:
是否可以在 sequelize 中定义一个关系,其中多个外键作为数组存储在一个字段中。基本上是一个belongsToMany,而不是一个关系表,所有ID都存储在一个字段中,以逗号分隔。查询将使用WHERE IN('1,5,7')。
【问题讨论】:
标签: sequelize.js
是否可以在 sequelize 中定义一个关系,其中多个外键作为数组存储在一个字段中。基本上是一个belongsToMany,而不是一个关系表,所有ID都存储在一个字段中,以逗号分隔。查询将使用WHERE IN('1,5,7')。
【问题讨论】:
标签: sequelize.js
使用**Op.in**代码在数组中查找结果为给定数组的where条件获取后续查询结果
var Sequelize = require('sequelize');
var Op = Sequelize.Op;
var arrayofTaskId = ['123', '456', '789'];
Tasks.findAll({
where: {
task_id: {
[Op.in]: arrayofTaskId
}
}
}).then(function(result) {
return res.json(result)
});
【讨论】:
你可以做到,但绝对没有外键约束——不可能存储外键数组。但是,您可以创建一个列,该列将是表示关联表 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;
});
}
}
});
【讨论】:
this.setDataValue()吗? *注意单数形式的使用
this 来自哪里?