譯者:飛龍
來源: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 。允許重新命名關聯訪問器。 |