与WHERE IN(“ARRAY”)的续集关系

时间:2017-03-10 13:38:59

标签: sequelize.js

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

2 个答案:

答案 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)