簡體   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