【问题标题】:How can I have a many-to-many association with Sequelize?如何与 Sequelize 建立多对多关联?
【发布时间】:2014-12-19 04:41:17
【问题描述】:

我有两个模型,定义为 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;
};

这符合预期并创建了三个表:Persons、Cars 和 CarsPersons。

我已经在表中添加了几个Cars,现在我想在Persons 表中添加一个Person。比方说,我有 15 个 CarId。所以在添加Person 时,我会这样做:

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

如何在 CarsPersons 表中创建一个关联,以使 CarId 为 15,PersonId 无论此新 ID 是什么?

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案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);
      });
    });
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多