繁体   English   中英

如何与Sequelize建立多对多关联?

[英]How can I have a many-to-many association with Sequelize?

我有两个模型,分别是“ Person和“ Car ”:

module.exports = function(sequelize, DataTypes) {
  var Person;
  Person = sequelize.define('Person', {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    profession: {
      type: DataTypes.STRING,
      allowNull: false
    }
  }, {
    classMethods: {
      associate: function(models) {
        return Person.hasMany(models.Car, {
          foreignKey: 'PersonId'
        });
      }
    }
  });

  return Person;
};

module.exports = function(sequelize, DataTypes) {
  var Car;
  Car = sequelize.define('Car', {
    vin: {
      type: DataTypes.STRING,
      allowNull: false
    },
    color: {
      type: DataTypes.STRING,
      allowNull: false
    }
  }, {
    classMethods: {
      associate: function(models) {
        return Car.hasMany(models.Person, {
          foreignKey: 'CarId'
        });
      }
    }
  });

  return Car;
};

这可以实现预期的结果并创建三个表: PersonsCarsCarsPersons

我已经在表中添加了一些Cars ,现在我想在Persons表中添加Person CarId我的CarId为15。 因此,在添加一个Person ,我这样做:

DB.Person.create({name: 'My Name', profession: 'Lawyer'}).complete(function(err)....

如何在CarsPersons表中创建关联,以使CarId为15,而PersonId为该新ID是什么?

DB.Person.create({name: 'My Name', profession: 'Lawyer'}).then(function (person) {
  // On latest master you can pass the id directly:
  person.addCar(15);

  // On older versions you will have to load the car object first:
  DB.Car.find(15).then(function (car) {
    person.addCar(car);
  });
});

除了上述答案(添加方法)之外,Sequelize注入方法还为处理外键设置等提供了一些便利。

对于多对多关联,您可以调用.create [AssociatedModel],并且会自动为您设置密钥。 例如,如果您要创建一个属于某个人的新汽车实例,则其工作原理类似于此:

// Find person who owns the car
DB.Person.find(5)
  .then(function (person) {

    // Will create entry with PersonId: 5, CarId: createdCarId
    person.createCar({ ... })
  })

当两个实例都已存在时,Jan的上述解决方案会很好地工作,但我认为通常应在创建时设置关联。

查看文档中的关联以查看其他注入的方法: http : //sequelize.readthedocs.org/en/latest/api/associations/#hasmanytarget-options

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM