Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to update an array in Sequelize Postgres

I have a user model in Sequelize for a Postgres db:

var User = sequelize.define('User', {
fb_id: DataTypes.STRING,
access_token: DataTypes.TEXT,
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
email: DataTypes.TEXT,
profilePictureURL: DataTypes.TEXT,
library: DataTypes.ARRAY(DataTypes.STRING)
}, {
underscored: true,
classMethods: {
  associate: function(models) {

   }
 }
  });

I am trying to update the library field by adding ISBNs to the array. This is the code for my POST request:

req.user.library.push(req.body._isbn); // adding the posted ISBN to the user object in my express-session

User.findOrCreate({where: {fb_id: req.user.fb_id}, 
        defaults: {
            access_token :      req.user.access_token,                 
            first_name :        req.user.first_name,
            last_name :         req.user.last_name,
            email :             req.user.email, 
            profilePictureURL : req.user.profilePictureURL,
            library: req.user.library // new library object
        }})
        .spread(function (updatedUser, created){
            res.status(200).json(updatedUser);
        }).error(function(err){
            res.status(500).json(err);
        });

There is no error, but the library field is not updated after checking the updatedUser object. How do I correctly update an array field in Sequelize?

like image 322
Robin Huang Avatar asked Jan 29 '17 18:01

Robin Huang


2 Answers

For next visitors, I may have found a better way to solve this issue :

User.update(
 {library: Sequelize.fn('array_append', Sequelize.col('library'), req.body._isbn)},
 {where: {fb_id: req.user.fb_id}}
);
like image 123
Paul Mathon Avatar answered Nov 14 '22 23:11

Paul Mathon


I ran into this before and found the answer deep in their Github issues. The way I accomplished it is

User.find({
  where: {
    fb_id: req.user.fb_id
  }
})
.then((user) => {
  user.library.push(req.body._isbn)
  user.update({
    library: user.library
  },{
    where: {
      fb_id: req.user.fb_id
    }
  })
  .then(user => res.json(user))
})

It definitely feels like there is a better way, but this way how I found a way.

like image 28
Edward Smith Avatar answered Nov 14 '22 21:11

Edward Smith