与Sequelize关系凡(“阵列”)

问题描述 投票:1回答:2

是否有可能定义一个sequelize关系在多个外键被存储在一个字段的数组。基本上是一个belongsToMany而是一个关系表的所有ID存储逗号在一个场分离。查询将与WHERE IN('1,5,7')

sequelize.js
2个回答
5
投票

你可以这样做,但绝对不用担心外键约束 - 没有储存外键的阵列的可能性。然而,可以创建,这将是表示关联表的ID的整数数组的一列。然后你只需要创建一些instanceMethods用于读取和设置数组值(记住,ARRAY类型仅适用于PostgreSQL的)。

我不推荐这种解决方案由于它不保证数据的一致性。让我们看一个例子 - 如果你删除这些类别之一,你需要记住手动删除的用户categories阵列此ID(使用一些hook或其他工具)用户属于多个类别,有ID为1,2和4。 ,否则该用户将仍然被分配到不再存在的一个类别。

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;
            });
        }
    }
});

3
投票

为了得到与在条件给定的数组使用**Op.in**代码,找出与数组导致sequelize查询结果

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)
});
© www.soinside.com 2019 - 2024. All rights reserved.