Jacob
Jacob

Reputation: 1004

Sequelize update with association

In sequelize it's possible to create a row and all its associations in one go like this:

return Product.create({
  title: 'Chair',
  User: {
    first_name: 'Mick',
    last_name: 'Broadstone'
  }
}, {
  include: [ User ]
});

Is there a equivalent for update? I tried

model.user.update(req.body.user, {where: {id: req.user.user_id}, include: [model.profile]})

But it's only updating user

Doing this for create works

model.user.create(user, {transaction: t, include: [model.profile]})

Upvotes: 40

Views: 64693

Answers (4)

roy-coder
roy-coder

Reputation: 1

Here is a clean way to do it:

const { Sequelize, DataTypes } = require("sequelize");
const {
  extendSequelize,
} = require("@hatchifyjs/sequelize-create-with-associations");

(async function main() {
  // create your Sequelize instance
  const sequelize = new Sequelize("sqlite::memory:", {
    logging: false,
  });

  // define your models
  const Product = sequelize.define("Product", {
    id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
    title: DataTypes.STRING,
  });

  const User = sequelize.define("User", {
    id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    productId: DataTypes.INTEGER,
  });

  Product.hasOne(User, {
    as: "user",
    foreignKey: "productId",
  });

  User.belongsTo(Product, {
    as: "product",
    foreignKey: "productId",
  });

  // create the tables
  await sequelize.sync();

  // extend Sequelize
  await extendSequelize(Sequelize);

  await Product.create({
    title: "Chair",
    user: {
      firstName: "Mick",
      lastName: "Broadstone",
    },
  });

  const table = await Product.create({
    title: "Table",
  });

  await User.update(
    { lastName: "Updated", product: { id: table.id } },
    { where: { id: 1 } }
  );
})();

Upvotes: 0

Abraham George
Abraham George

Reputation: 49

await Job.update(req.body, {
        where: {
          id: jobid
        }
      }).then(async function () {
        await Job.findByPk(jobid).then(async function (job) {
          await Position.findOrCreate({ where: { jobinput: req.body.jobinput } }).then(position => {
            job.setPositions(position.id)
          })
})

Here positon belongsToMany job

Upvotes: 1

Marcin
Marcin

Reputation: 447

If you want to update both models(Product & Profile) at once. One of the approaches can be:

// this is an example of object that can be used for update
let productToUpdate = {
    amount: 'new product amount'
    Profile: {
        name: 'new profile name'
    }
};
Product
    .findById(productId)
    .then((product) => {
        if(!product) {
            throw new Error(`Product with id ${productId} not found`);
        }

        product.Profile.set(productToUpdate.Profile, null);
        delete productToUpdate.Profile; // We have to delete this object to not reassign values
        product.set(productToUpdate);

        return sequelize
            .transaction((t) => {
                return product
                    .save({transaction: t})
                    .then((updatedProduct) => updatedProduct.Profile.save());
            })
    })
    .then(() => console.log(`Product & Profile updated!`))

Upvotes: 2

mabc224
mabc224

Reputation: 742

First you have to find model including sub model which you want to update. then you can get reference of sub model to update easily. i am posting an example for your reference. hope it will help.

var updateProfile = { name: "name here" };
var filter = {
  where: {
    id: parseInt(req.body.id)
  },
  include: [
    { model: Profile }
  ]
};

Product.findOne(filter).then(function (product) {
  if (product) {
    return product.Profile.updateAttributes(updateProfile).then(function (result) {
      return result;
    });
  } else {
    throw new Error("no such product type id exist to update");
  }
});

Upvotes: 16

Related Questions