多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# hasMany(多对多关系) > 译者:[飞龙](https://github.com/wizardforcel) > 来源:[hasMany](https://github.com/dresende/node-orm2/wiki/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`。允许重命名关联访问器。 |