orm2 中文文件 4.2 hasMany(多對多關係)

飛龍發表於2016-01-10

譯者:飛龍

來源:hasMany

hasMany

是多對多的關係(包括連線表)。

例如:Patient.hasMany(`doctors`, Doctor, { why: String }, { reverse: `patients`, key: true })

病人可以擁有許多不同的醫生。每個醫生可以擁有許多不同的病人。

當你呼叫Patient.sync()時,會建立一個連線表patient_doctors

列名稱 型別
patient_id Integer
doctor_id Integer
why varchar(255)

下列函式是可用的:

// 獲取所有關聯醫生的列表
patient.getDoctors(function(err, doctors) {
  // ...
});

// 向連線表中增加記錄
patient.addDoctors([phil, bob], function(err) {
  // ...
});

// 移除連線表中的現有記錄,並增加新的
patient.setDoctors([phil, nephewOfBob], function(err) {
  // ...
});

// 檢查是否某個病人關聯了指定的醫生
patient.hasDoctors([bob], function(err, patientHasBobAsADoctor) {
  // because that is a totally legit and descriptive variable name
  if (patientHasBobAsADoctor) {
    // ...
  } else {
    // ...
  }
});

// 從連線表中移除指定記錄
patient.removeDoctors([bob], function(err) {
  // ...
});

// 並且所有醫生都有自己的方法來獲取病人
bob.getPatients(function(err, patients) {
  if (patients.indexOf(you) !== -1) {
    // woot!
  } else {
    // ...
  }
});

// 以及其他

要把醫生關聯到病人:

patient.addDoctor(surgeon, {why: `remove appendix`}, function(err) {
  // ...
});

// or...
surgeon.addPatient(patient, {why: `remove appendix`}, function(err) {
  // ...
});

這樣會新增{patient_id: 4, doctor_id: 6, why: "remove appendix"}到連線表中。

API

Model.hasMany(
  name,       // String. 關聯名稱
  otherModel, // Model. 要關聯的模型
  extraProps, // Object. 在連線表上出現的額外屬性
  opts        // Object. 關聯的選項
);

選項

選項名稱 型別 描述
autoFetch Boolean 預設為false。如果為true,關聯將會自動被獲取。
autoFetchLimit Number 預設為1。自動獲取的深度。
key Boolean 預設為false(由於歷史原因)。如果為true,表中外來鍵的列會形成一個組合鍵。
mergeTable String 連線表的自定義名稱
mergeId String 代表當前模型那一列的自定義名稱
mergeAssocId String 代表另一個模型那一列的自定義名稱
reverse String 預設為false。如果為true,關聯可以通過另一個模型使用指定方法獲取到。
getAccessor String 預設為`get` + Name。允許重新命名關聯訪問器。
setAccessor String 預設為`set` + Name。允許重新命名關聯訪問器。
hasAccessor String 預設為`has` + Name。允許重新命名關聯訪問器。
delAccessor String 預設為`del` + Name。允許重新命名關聯訪問器。
addAccessor String 預設為`add` + Name。允許重新命名關聯訪問器。

相關文章