Set the custom properties in joining model using LoopBacks HasManyThrough

情到浓时终转凉″ 提交于 2019-12-12 05:39:46

问题


I am trying to set up a many to many relationship in LoopBack 2.1.2

http://docs.strongloop.com/display/LB/HasManyThrough+relations

I tried to POST /api/patients/:patientId/physicians to create a new physician which links the patientId to the new physician, but does not set the appointmentDate in the appointment model.

Is there one API call to create this in one transaction? What is the best way to add a new physician to a patient and setting the appointmentDate? Do I have to create my own RESTFUL API call?

These are my json models

filename: appointment.json

{
    "name": "appointment",
    "base": "PersistedModel",

    "relations": {
        "patient": {
            "type": "belongsTo",
            "model": "patient"
        },
        "physician": {
            "type": "belongsTo",
            "model": "physician"
        }
    },


    "properties": {
        "appointmentDate": {
            "type": "string"
        }
    },

    "validations": [],
    "acls": [],
    "methods": []
}

filename: patient.json

{
    "name": "patient",
    "base": "PersistedModel",

    "relations": {
        "physicians": {
            "type": "hasMany",
            "model": "physician",
            "through": "appointment"
        }
    },

    "properties": {
        "name": {
            "type": "string"
        }
    },

    "validations": [],
    "acls": [],
    "methods": []
}

filename: physician.json

{
    "name": "physician",
    "base": "PersistedModel",

    "relations": {
        "patients": {
            "type": "hasMany",
            "model": "patient",
            "through": "appointment"
        }
    },

    "properties": {
        "name": {
            "type": "string"
        }
    },

    "validations": [],
    "acls": [],
    "methods": []
}

回答1:


Disclaimer: I am a LoopBack developer working for StrongLoop.

Is there one API call to create this in one transaction?

No, there is no such API at the moment.

What is the best way to add a new physician to a patient and setting the appointmentDate?

You have to send two requests: The first one to create a physician (POST /physicians), the second one to create the appointment (POST /appointments).

Alternatively, you can use "Patient hasMany appointments" instead of "Patient hasMany physicians through Appointment", in which case the appointment can be added via

POST /patients/:patientId/appointments`

You will still have to create the physician first.

Do I have to create my own RESTFUL API call?

You can certainly do that, although I personally don't understand why two requests are a problem in this case. The operation "create a new physician with an appointment for the given patient" looks weird to me. Two steps ("create a new physician", and some time later "make an appointment") make more sense to me.

However, if you have a good example where it makes sense to create both records in one request, then please open a github issue in strongloop/loopback to discuss this further.

More info

At the moment, the "hasMany through" relation is tuned for the purpose of "hasAndBelongsToMany" relation, where the "through" model is just a container for the two id properties (foreign keys). That's the reason why the relation methods like POST /api/patients/:patientId/physicians do not support "through" properties like "appointmentDate".

I have created a github issue loopback#466 to discuss how to improve this part of LoopBack, feel free to comment there.

There is also a bug in loopback-explorer (#39), where the UI suggest that POST /patients/{id}/physicians is expecting an Appointment, even though the implementation expects a Physician instead.



来源:https://stackoverflow.com/questions/25256741/set-the-custom-properties-in-joining-model-using-loopbacks-hasmanythrough

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!