Свойство 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
Вы когда-то создавали модель Person? Эта ошибка обычно означает, что loopback ожидает увидеть столбец person_id из вашей базы данных, но он не был создан. Это может быть артефакт, который вы можете удалить, потому что он не имеет смысла, если вы явно не создали отношение к модели Person. - person notbrain; 19.08.2015
comment
Обе модели подключены к базе данных MySQL. В таблице за ChiliUserData есть три столбца: id, person_id и дата рождения. Все должно быть хорошо, насколько я понимаю. - person toXel; 19.08.2015
comment
Один из способов узнать это — удалить базу данных и запустить миграцию, чтобы воссоздать всю базу данных на основе информации из model.json. dataSource.automigrate(['ChiliUserData', 'ChiliUser'], function(err){...}). Затем БД будет отражать состояние, ожидаемое API. Не имеет смысла иметь person_id там, если у вас нет ни модели Person, ни явного отношения. - person notbrain; 25.08.2015
comment
И еще: используя 'base': 'ChiliUserData' для ChiliUser, API ожидает создания только 1 таблицы: ChiliUser, в которой будут столбцы из обеих моделей. - person notbrain; 25.08.2015