hasMany(多对多关系)

译者:飞龙

来源: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)

下列函数是可用的:

  1. // 获取所有关联医生的列表
  2. patient.getDoctors(function(err, doctors) {
  3. // ...
  4. });
  5. // 向连接表中增加记录
  6. patient.addDoctors([phil, bob], function(err) {
  7. // ...
  8. });
  9. // 移除连接表中的现有记录,并增加新的
  10. patient.setDoctors([phil, nephewOfBob], function(err) {
  11. // ...
  12. });
  13. // 检查是否某个病人关联了指定的医生
  14. patient.hasDoctors([bob], function(err, patientHasBobAsADoctor) {
  15. // because that is a totally legit and descriptive variable name
  16. if (patientHasBobAsADoctor) {
  17. // ...
  18. } else {
  19. // ...
  20. }
  21. });
  22. // 从连接表中移除指定记录
  23. patient.removeDoctors([bob], function(err) {
  24. // ...
  25. });
  26. // 并且所有医生都有自己的方法来获取病人
  27. bob.getPatients(function(err, patients) {
  28. if (patients.indexOf(you) !== -1) {
  29. // woot!
  30. } else {
  31. // ...
  32. }
  33. });
  34. // 以及其他

要把医生关联到病人:

  1. patient.addDoctor(surgeon, {why: 'remove appendix'}, function(err) {
  2. // ...
  3. });
  4. // or...
  5. surgeon.addPatient(patient, {why: 'remove appendix'}, function(err) {
  6. // ...
  7. });

这样会添加{patient_id: 4, doctor_id: 6, why: "remove appendix"}到连接表中。

API

  1. Model.hasMany(
  2. name, // String. 关联名称
  3. otherModel, // Model. 要关联的模型
  4. extraProps, // Object. 在连接表上出现的额外属性
  5. opts // Object. 关联的选项
  6. );

选项

选项名称 类型 描述
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。允许重命名关联访问器。