Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to remove relation for specific instances with sequelize / mysql

I created a many-to-many association between courses and users like this:

Course.belongsToMany(User, { through: 'CourseUser'});
User.belongsToMany(Course, { through: 'CourseUser'});

which generates a join table called CourseUser.

I add a relation for a specific course and user with the following server side function that happens on the click of a button: the userCourse variable looks like this: { UserId: 7, CourseId: 13 }

  addUser: function(req, res) {
    var userCourse = req.body;
    db.CourseUser.create(userCourse).then(function () {
      res.sendStatus(200);
    });
  }
  1. Is this the correct way of adding the association between an existing user and an existing course? (if not, what is the correct way)

  2. I would like to have an ability of removing the association when clicking on another button. But I can't quite figure out how to set up the function.

like image 944
jmancherje Avatar asked Jan 16 '16 20:01

jmancherje


People also ask

How do I remove items from Sequelize?

To delete rows of data from your SQL table using Sequelize, you need to use the provided destroy() method. The destroy() method can be called from any Model or instance of your Model to delete rows from your table.

How do I close a connection in Sequelize?

Closing the connection​ If you need to close the connection, call sequelize.close() (which is asynchronous and returns a Promise). Once sequelize.close() has been called, it's impossible to open a new connection. You will need to create a new Sequelize instance to access your database again.

How do you do a one to many relationship in Sequelize?

Creating the standard relationships​ To create a One-To-One relationship, the hasOne and belongsTo associations are used together; To create a One-To-Many relationship, the hasMany and belongsTo associations are used together; To create a Many-To-Many relationship, two belongsToMany calls are used together.


2 Answers

  1. If you already have a User and Course instance and are just associating them in addUser, then yes, this is the correct way of creating an association between them.
  2. You should be able to remove this association in at least 4 ways:

1: Through User model:

User.removeCourse(courseObject);

2: Through Course model:

Course.removeUser(userObject);

3: On the CourseUser model, without having a CourseUser instance available:

db.CourseUser.destroy({
    where: {...}
});

4: Having a CourseUser instance available:

courseUser.destroy();

You can bind .then and .catch on all these operations to do something on success / on error.

like image 168
leroydev Avatar answered Oct 01 '22 08:10

leroydev


Your model relationship is okay:

Course.belongsToMany(User, { through: 'CourseUser'}); User.belongsToMany(Course, { through: 'CourseUser'});

and values:
{ UserId: 7, CourseId: 13 }

Implementation could look thus for adding a UserCourse relationship:

addUser: function(req, res) {
    const { UserId, CourseId } = req.body;
    db.Course.findOne({
        where: { id: CourseId }
    }).then(course => {
        course.setUsers([UserId])
        res.sendStatus(200);
    }).catch(e => console.log(e));
}

while this could handle user detaching:
removeUser: function (req, res) {
    const { UserId, CourseId } = req.body;
    db.Course.findOne({
        where: { id: CourseId }
    }).then(course => {
        course.removeUsers([UserId])
        res.sendStatus(200);
    }).catch(e => console.log(e));
}

I hope this will be helpful however
like image 39
Ekfinbarr Avatar answered Oct 01 '22 06:10

Ekfinbarr