Loopbackjs 环回从同一关系访问超级模型和扩展模型

Loopbackjs 环回从同一关系访问超级模型和扩展模型,loopbackjs,extends,relation,Loopbackjs,Extends,Relation,我使用的是环回3,我有以下三种型号: UserFile.json { "name": "UserFile", "base": "PersistedModel", "idInjection": true, "options": { "validateUpsert": true }, "properties": { "id": { "type": "number", "id": true, "generated": true

我使用的是环回3,我有以下三种型号:

UserFile.json

{
  "name": "UserFile",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "id": {
      "type": "number",
      "id": true,
      "generated": true
    },
    "name": {
      "type": "string",
      "required": true
    },
    "size": {
      "type": "number",
      "default": 0
    },
    "uploadedAt": {
      "type": "date",
      "default": "$now"
    }
  },
  "relations": {
    "hasFile": {
      "type": "hasMany",
      "model": "UploadedFile",
      "foreignKey": "fileId"
    }
  }
}
{
  "name": "UploadedFile",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "hashId": {
      "type": "string",
      "required": true
    },
    ......
  },
  "relations": {
    "file": {
      "type": "belongsTo",
      "model": "UserFile",
      "foreignKey": "fileId"
    }
  }
}
{
  "name": "PartitionedFile",
  "base": "UploadedFile",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "partSize": {
      "type": "number",
      "default": 0
    }
  },
  "relations": {
    "file": {
      "type": "belongsTo",
      "model": "UserFile",
      "foreignKey": "fileId"
    }
  }
}
UploadedFile.json

{
  "name": "UserFile",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "id": {
      "type": "number",
      "id": true,
      "generated": true
    },
    "name": {
      "type": "string",
      "required": true
    },
    "size": {
      "type": "number",
      "default": 0
    },
    "uploadedAt": {
      "type": "date",
      "default": "$now"
    }
  },
  "relations": {
    "hasFile": {
      "type": "hasMany",
      "model": "UploadedFile",
      "foreignKey": "fileId"
    }
  }
}
{
  "name": "UploadedFile",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "hashId": {
      "type": "string",
      "required": true
    },
    ......
  },
  "relations": {
    "file": {
      "type": "belongsTo",
      "model": "UserFile",
      "foreignKey": "fileId"
    }
  }
}
{
  "name": "PartitionedFile",
  "base": "UploadedFile",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "partSize": {
      "type": "number",
      "default": 0
    }
  },
  "relations": {
    "file": {
      "type": "belongsTo",
      "model": "UserFile",
      "foreignKey": "fileId"
    }
  }
}
PartitionedFile.json

{
  "name": "UserFile",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "id": {
      "type": "number",
      "id": true,
      "generated": true
    },
    "name": {
      "type": "string",
      "required": true
    },
    "size": {
      "type": "number",
      "default": 0
    },
    "uploadedAt": {
      "type": "date",
      "default": "$now"
    }
  },
  "relations": {
    "hasFile": {
      "type": "hasMany",
      "model": "UploadedFile",
      "foreignKey": "fileId"
    }
  }
}
{
  "name": "UploadedFile",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "hashId": {
      "type": "string",
      "required": true
    },
    ......
  },
  "relations": {
    "file": {
      "type": "belongsTo",
      "model": "UserFile",
      "foreignKey": "fileId"
    }
  }
}
{
  "name": "PartitionedFile",
  "base": "UploadedFile",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "partSize": {
      "type": "number",
      "default": 0
    }
  },
  "relations": {
    "file": {
      "type": "belongsTo",
      "model": "UserFile",
      "foreignKey": "fileId"
    }
  }
}
其思想是,用户文件要么有一个上传文件,要么(两个或更多)多个分区文件
我希望能够从用户文件中,从文件的相同关系中获取,无论是上传文件还是分区文件。仅从模型的定义就可以实现这一点,还是只能通过远程方法实现这一点?

从一个模型到另一个模型的关系仅绑定到一个模型;因此,不能有一个称为“文件”的关系指向不同的模型。在您的示例中,它绑定到
UploadedFile
。为了使您的模型
UserFile
同时与
UploadedFile
PartitionedFile
建立关系,您需要两种不同的关系

要使您的UserFile具有一个UploadedFile或多个PartitionedFile,需要在其关系中同时具有这两个文件:

{
“名称”:“用户文件”,
...
“关系”:{
“上载的文件”:{
“type”:“hasOne”,//一个上载文件上的值为零
“模型”:“上传文件”,
“foreignKey”:“uploadedFileId”
},
“分区文件”:{
“type”:“hasMany”,//零个或多个分区文件
“模型”:“PartitionedFile”
}
}
}
然后,要通过
UserFile
UploadedFiles
PartitionedFiles
中检索文件,您不需要遥控器,只需要在请求中包含模型

例如,在ReactJS中,它将如下所示:

const response=wait Axios.get(`/api/UserFile`{
参数:{
过滤器:{
包括:[
{关系:'uploadedFiles'},
{关系:'partitionedFiles'},
]
}
}
}
另一种解决方案是指定另一个包含所有这些关系的模型
文件
上传文件
分区文件
,等等),以便模型
用户文件
可以引用表
文件
,作为检索文件的唯一关系