一对多

概述

一个一对多的连接表示的一个模型可以关联到多个模型。为了构建这种连接一个虚拟的属性被添加到一个模型中使用collection属性。在一个一对多的关联中一端必须有一个collection属性并且其他端必须包含一个model属性。这就允许多端知道哪个记录它们需要去获取当一个populate使用的时候。

因为你也许想要一个模型有多个一对多的关联在其他模型上,那么via的关键词在collection属性上是必须的了。这表明在关联的一端的model属性总是用于populate记录出来。

// 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'
    }
  }
};

现在pets和users已经互相知道对方了,它们可以被关联了。为了实现这个关联我们可以为owner值创建或者更新pet的user关键词。

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

  // Set the User's Primary Key to associate the Pet with the User.
  owner: 123
})
.exec(function(err, pet) {});

现在Pet已经关联到User了,所有的pets都从属于一个指定的用户,并使用populate方法找到。

User.find()
.populate('pets')
.exec(function(err, users) {
  if(err) // handle error

  // 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
  //   }]
  // }]
});

注意

关于更细节的描述请参考Waterline Docs

results matching ""

    No results matching ""