Свойство Strongloop от релация в родител

Не знам дали просто съм сляп или нещо подобно, но как мога да направя следното:

Имам User модел с hasOne връзка с UserData модел. Искам само едно свойство на UserData директно в резултатите от User.

Връзката в User изглежда така:

"relations": {
  "userData": {
    "type": "hasOne",
    "model": "UserData"
  }
}

И обхватът по подразбиране в User:

"scope": {
  "include": "userData"
}

Така че резултатът за едно User е:

[
  {
    "id": 5,
    "email": "[email protected]",
    "name": "Example",
    "userData": {
      "id": 5,
      "birthdate": "1971-09-06T00:00:00.000Z"
    }
  }
]

Но това, което искам е следното:

[
  {
    "id": 5,
    "email": "[email protected]",
    "name": "Example",
    "birthdate": "1971-09-06T00:00:00.000Z"
  }
]

Как мога да постигна това?

Редактиране:

Двете дефиниции на модела:

ChiliUser:

{
  "name": "ChiliUser",
  "base": "ChiliUserData",
  "idInjection": true,
  "options": {
    "validateUpsert": true,
    "mysql": {
      "table": "person"
    }
  },
  "properties": {
    "id": {
      "type": "number"
    },
    "email": {
      "type": "string"
    },
    "password": {
      "type": "string"
    },
    "vorname": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "spitzname": {
      "type": "string"
    },
    "strasse": {
      "type": "string"
    },
    "plz": {
      "type": "number"
    },
    "ort": {
      "type": "string"
    },
    "geolat": {
      "type": "string"
    },
    "geolng": {
      "type": "string"
    }
  },
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}

ChiliUserData:

{
  "name": "ChiliUserData",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true,
    "mysql": {
      "table": "person_data"
    }
  },
  "properties": {
    "id": {
      "type": "number"
    },
    "person_id": {
      "type": "number"
    },
    "birthdate": {
      "type": "date"
    }
  },
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}

person toXel    schedule 17.08.2015    source източник


Отговори (1)


Използвате ли вградения модел User? Ако сте, можете просто да го разширите с вашия UserData модел, като използвате base: "User", и основната схема ще бъде както желаете:

{
  "name": "UserData",
  "base": "User",
  "properties": {}
  ...
}

Но тази настройка би означавала, че ще използвате UserData върху User във вашия код. Тъй като вграденият модел User пречи, бих препоръчал различна дума като Person или Customer, в който случай ще изглежда така:

{
  "name": "Person",
  "base": "User",
  "properties": {
    ...extra user data properties only...
  }
  ...
}

По този начин само Person ще има всички допълнителни полета за „потребителски данни“, но също така ще включва всички полета/методи, дефинирани за User в node_modules/loopback/common/models/User.json. Ако използвате MySQL, таблицата Person ще бъде създадена с комбинация от полета както от User, така и от Person.

person notbrain    schedule 17.08.2015
comment
Благодаря за отговора! Не, не използвам вградения потребителски модел. Просто го преименувах тук във въпроса за по-добра четливост. Моделите са ChiliUser и ChiliUserData в приложението ми. Има ли алтернативен начин за това? Защото моделът ChiliUser е основният модел в случая и така ми трябва. - person toXel; 18.08.2015
comment
Мисля, че можете да постигнете желания ефект, като дефинирате модела ChiliUser с "base": "ChiliUserData". - person notbrain; 18.08.2015
comment
Добавих дефинициите на модела в моя въпрос по-горе. Когато изпълня метода по подразбиране GET сега за ChiliUser, тогава StrongLoop ми дава тази грешка: ER_BAD_FIELD_ERROR: Unknown column 'person_id' in 'field list'. Трябва ли да направя нещо допълнително, за да добавя само "base": "ChiliUserData"? - person toXel; 19.08.2015
comment
Създадохте ли модел на човек в един момент? Тази грешка обикновено означава, че loopback очаква да види колона person_id от вашата база данни, но тя не е създадена. Може да е артефакт, който можете да премахнете, защото няма смисъл, освен ако изрично не сте създали връзка с модел на човек. - person notbrain; 19.08.2015
comment
И двата модела са свързани към MySQL база данни. Таблицата зад ChiliUserData има три колони: id, person_id и рождена дата. Би трябвало да е наред, доколкото разбирам. - person toXel; 19.08.2015
comment
Един от начините да разберете е да премахнете вашата DB и да стартирате миграция, за да пресъздадете цялата база данни въз основа на информацията за model.json. dataSource.automigrate(['ChiliUserData', 'ChiliUser'], function(err){...}). Тогава DB ще отразява състоянието, което API очаква. Няма смисъл да имате person_id там, ако нямате нито Person модел, нито изрична връзка. - person notbrain; 25.08.2015
comment
Още нещо: използвайки 'base': 'ChiliUserData' за ChiliUser, API очаква да бъде създадена само 1 таблица: ChiliUser, която ще има колони и от двата модела. - person notbrain; 25.08.2015