是否可以在sequelize中定义关系,其中多个外键在一个字段中作为数组存储。基本上是belongsToMany但是不是关系表,所有id都以逗号分隔在一个字段中。查询将使用WHERE IN('1,5,7')
。
答案 0 :(得分:3)
你可以这样做,但绝对没有外键约束 - 不存在存储外键数组的可能性。但是,您可以创建一个列,该列将是表示关联表的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;
});
}
}
});
答案 1 :(得分:1)
使用**Op.in**
代码在给定数组中的条件为条件的情况下,通过使用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)
});
代码在数组中查找结果来获得查询结果
s = [{'data': 'sql_data'},{'data':'mongo_data'},{'data':'sql_data'}]
new = []
for x in s:
if x not in new: new.append(x)
print(new)