Sequelize relation with WHERE IN (“ARRAY”)

后端 未结 2 745
迷失自我
迷失自我 2021-01-18 05:29

Is it possible to define a relationships in sequelize where multiple foreign keys are stored as an array in one field. Basically a belongsToMany but instead of an relation t

相关标签:
2条回答
  • 2021-01-18 05:51

    You can do it, but definitely without foreign key constraints - there is no possibility of storing array of foreign keys. You can however create a column which will be an array of integers representing IDs of associated table. Then you just need to create some instanceMethods for retrieving and setting the array values (remember that the ARRAY type is only available in PostgreSQL).

    I do not recommend this solution due to the fact that it does not ensure data consistency. Let's consider an example - user belongs to many categories with ids 1, 2 and 4. If you delete one of those categories, you need to remember to manually remove this id from categories array of user (with use of some hook or other tool), otherwise this user will still be assigned to a category that no longer exists.

    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;
                });
            }
        }
    });
    
    0 讨论(0)
  • 2021-01-18 06:00

    To get sequelize query result with where condition for given array with using **Op.in** code to find result with in array as

    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)
    });
    
    0 讨论(0)
提交回复
热议问题