Join tra modelli in LoopBack

Join tra modelli in LoopBack

In pratica, nel mio db, ho una tabella movimenti, che ha due FOREIGN KEY su altre due tabelle (causali e conti).

Ogni movimento può avere un conto e una causale.

Nel momento in cui vado a creare in LoopBack le relazioni, il modello risultante è comunque così:

[
  {
    "mov_id": 0,
    "mov_tipo": "string",
    "mov_valore": 0,
    "mov_causale_fk": 0,
    "mov_conto_fk": 0,
    "mov_data": "2017-10-06T13:44:32.241Z",
    "mov_note": "string",
    "mov_utente_fk": 0,
    "mov_aggiunta": "2017-10-06T13:44:32.241Z"
  }
]

Come vedete non c'è traccia delle tabelle collegate, mentre io avrei bisogno di vedere anche quei campi.

In sostanza una classica JOIN se facessi una query diretta.

Il trucco sta nell'usare lo scope e l'opzione include nel modello.

Quindi il modello completo (relazioni comprese) sarà così:

{
  "name": "movimenti",
  "plural": "movimenti",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "scope": {
    "include": [
      "causale_fk",
      "conto_fk"
    ]
  },
  "properties": {
    "mov_id": {
      "type": "number",
      "id": true,
      "required": true
    },
    "mov_tipo": {
      "type": "string",
      "required": true
    },
    "mov_valore": {
      "type": "number",
      "required": true
    },
    "mov_causale_fk": {
      "type": "number",
      "required": true
    },
    "mov_conto_fk": {
      "type": "number",
      "required": true
    },
    "mov_data": {
      "type": "date",
      "required": true
    },
    "mov_note": {
      "type": "string"
    },
    "mov_utente_fk": {
      "type": "number",
      "required": true
    },
    "mov_aggiunta": {
      "type": "date",
      "required": true
    }
  },
  "validations": [],
  "relations": {
    "causale_fk": {
      "type": "hasOne",
      "model": "causali",
      "foreignKey": "causale_id"
    },
    "conto_fk": {
      "type": "hasOne",
      "model": "conti",
      "foreignKey": "conto_id",
      "include": "conti"
    }
  },
  "acls": [],
  "methods": {}
}

Adesso il risultato sarà una cosa del genere:

[
  {
    "mov_id": 0,
    "mov_tipo": "string",
    "mov_valore": 0,
    "mov_causale_fk": 0,
    "mov_conto_fk": 0,
    "mov_data": "2017-10-06T13:44:32.241Z",
    "mov_note": "string",
    "mov_utente_fk": 0,
    "mov_aggiunta": "2017-10-06T13:44:32.241Z",
    "causale_fk": {
      "causale_id": 0,
      "causale_nome": "nome",
      "utente_id": 0
    },
    "conto_fk": {
      "conto_id": 0,
      "conto_nome": "nome",
      "utente_id": 0
    }
  }
]

Enjoy!