Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sequelize.js insert a model with one-to-many relationship

I have two sequelize models with one-to-many relationship. Let's call them Owner and Property.

Assume they are defined using the sails-hook-sequelize as such (simplified).

//Owner.js
module.exports = {
options: {
  tableName: 'owner'
},
attributes: {
  id: {
    type: Sequelize.BIGINT,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true
  },
  name: {
    type: Sequelize.STRING(255)
  },
  associations: function () {
     Owner.hasMany(Property, {
     foreignKey: {
       name: 'owner_id'
     }
   });
 }
}

//Property.js
module.exports = {
options: {
  tableName: 'property'
},
attributes: {
  id: {
    type: Sequelize.BIGINT,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true
  },
  name: {
    type: Sequelize.STRING(255)
  }
}

Now assume I want to insert an Owner record in my database and insert a few property records to associate with the owner. How do I do this?

I'm looking for something like

Owner.create({name:'nice owner',
              property: [{name:'nice property'},
                         {name:'ugly property'}]});

Surprisingly I can't find this in the Sequelize documentation.

like image 476
Juraj Petrik Avatar asked Jun 14 '16 13:06

Juraj Petrik


People also ask

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

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.

How do I import a model into Sequelize?

To import Sequelize models, you need to export the model as a module first. The code above creates a new instance of the Sequelize class to connect to your database. The sequelize instance needs to be passed into the user. js model file when you call the require() function.

How to create a one-to-one relationship between two Sequelize models?

The belongsTo()method allows you to create a one-to-one relationship between two Sequelize models. In this example, you are using the Studentand Grademodels. Create a new file called one_to_one.js.

What is Sequelize model in Laravel?

This Sequelize Model represents tutorials table in MySQL database. These columns will be generated automatically: id, title, description, createdAt, updatedAt. After initializing Sequelize, we don’t need to write CRUD functions, Sequelize supports all of them: update, destroy ,… We’re gonna use Sequelize Model functions in our Controller.

What are the MySQL parameters for Sequelize model?

First five parameters are for MySQL connection. For more details, please visit API Reference for the Sequelize constructor. This Sequelize Model represents tutorials table in MySQL database. These columns will be generated automatically: id, title, description, createdAt, updatedAt.

What is many-to-many association with Sequelize?

In this tutorial, I will show you one of the most important Relationships that you will use in most database structures: Many-to-Many Association with Sequelize in Node.js example. In systems analysis, a Many-to-Many relationship occurs between two Entities when a One-to-Many relationship between them works both ways:


1 Answers

You can't associate property existing records when you create the owner, you have to do that right after, with promise chain.

Owner.create({name:'nice owner'}).then(function(owner){ 
    owner.setProperties([{name:'nice property'}, {name:'ugly property'}]).then(/*...*/);
});

To avoid any problems with those associations (owner created but some associations failed), it's better to use transactions.

sequelize.transaction(function(t) {
    return Owner.create({name:'nice owner'}, {transaction: t}).then(function(owner){ 
        return owner.setProperties([{name:'nice property'}, {name:'ugly property'}], {transaction : t});
    });
});

However, if you want to create new Owner associated to new Properties you can do something like

Owner.create({
   name: 'nice owner',
   property: [
      { name: 'nice property'},
      { name: 'ugly property'}
   ]
},{
   include: [ Property]
}); 

See http://docs.sequelizejs.com/en/latest/docs/associations/#creating-with-associations

like image 167
Raptack Avatar answered Oct 12 '22 03:10

Raptack