【问题标题】:Sequelize relation with WHERE IN ("ARRAY")Sequelize 与 WHERE IN ("ARRAY") 的关系
【发布时间】:2019-02-07 15:33:13
【问题描述】:

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

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    使用**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)
    });
    

    【讨论】:

      【解决方案2】:

      你可以做到,但绝对没有外键约束——不可能存储外键数组。但是,您可以创建一个列,该列将是表示关联表 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 来自哪里?
      • @AlanYong 我猜它来自模型类
      猜你喜欢
      • 2016-12-17
      • 2020-03-30
      • 2015-10-23
      • 2019-08-18
      • 2014-08-08
      • 2020-01-07
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多