我怎样才能与Sequelize建立多对多的联系?

时间:2014-08-15 13:25:17

标签: mysql node.js sequelize.js

我有两个模型,PersonCar定义:

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,现在我想在Person表格中添加Persons。我有一个CarId的15,让我们说。所以在添加Person时,我会这样做:

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

如何在CarsPersons表格中创建一个关联,使CarId为15 {和PersonId这个新ID?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

除了上面的答案(添加方法)之外,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