Edit Page

One-to-many

AKA "Has Many"

Overview

#

A one-to-many association states that a model can be associated with many other models. To build this association a virtual attribute is added to a model using the collection property. In a one-to-many association, the "one" side must have a collection attribute, and the "many" side must contain a model attribute. This allows the "many" side to know which records it needs to get when populate is used.

Because you may want a model to have multiple one-to-many associations on another model, a via key is needed on the collection attribute. This states which model attribute on the one side of the association is used to populate the records.

// myApp/api/models/User.js
// A user may have many pets
module.exports = {
  attributes: {
    firstName: {
      type: 'string'
    },
    lastName: {
      type: 'string'
    },

    // Add a reference to Pets
    pets: {
      collection: 'pet',
      via: 'owner'
    }
  }
};
// myApp/api/models/Pet.js
// A pet may only belong to a single user
module.exports = {
  attributes: {
    breed: {
      type: 'string'
    },
    type: {
      type: 'string'
    },
    name: {
      type: 'string'
    },

    // Add a reference to User
    owner: {
      model: 'user'
    }
  }
};

Now that the pets and users know about each other, they can be associated. To do this we can create or update a pet with the user's primary key for the owner value.

await Pet.create({
  breed: 'labrador',
  type: 'dog',
  name: 'fido',

  // Set the User's Primary Key to associate the Pet with the User.
  owner: 123
});

Now that the Pet is associated with the User, all the pets belonging to a specific user can be populated by using the .populate() method.

var users = await User.find().populate('pets');
  // The users object would look something like the following
  // [{
  //   id: 123,
  //   firstName: 'Foo',
  //   lastName: 'Bar',
  //   pets: [{
  //     id: 1,
  //     breed: 'labrador',
  //     type: 'dog',
  //     name: 'fido',
  //     user: 123
  //   }]
  // }]

Is something missing?

If you notice something we've missed or could be improved on, please follow this link and submit a pull request to the sails repo. Once we merge it, the changes will be reflected on the website the next time it is deployed.

Concepts