如何自动将 属性 从关系附加到根对象?

How can I automatically append a property from a relation to the root object?

如何自动将 属性 从关系附加到根对象,就好像它是来自同一 table 的列,但实际上它来自另一个 table .

假设我有一个 User 模型 hasMany Emails.

我怎样才能只附加来自 User 模型的第一个 Email 的电子邮件,这样每次我查询 User 模型我觉得它像 属性?

示例:

我在做什么:

(await User.query().where('id', id).with('emails').first()).toJSON()
{
  "name": "Eleandro Duzentos",
  "emails": [
    { "email": "eleandro@inbox.ru" },
    { "email": "eleandro@mail.ru" }
  ]
}

我想要的:

(await User.find(id)).toJSON()
{
  "name": "Eleandro Duzentos",
  "email": "eleandro@inbox.ru"
}

Obs:我不会将电子邮件放在同一个 table 上,因为在很长一段时间内,用户可能需要不止一封电子邮件,但目前只有一封。

我该怎么做?

这是我的代码。您可能会从中得到启发:

型号User:

...
const Email = use('App/Models/Email')

class User extends Model {

  async getEmails() {
    let list = []

    let emails = await Email.query().where('user_id', this.id).fetch()
    emails.rows.forEach(email => {
      list.push({ name: this.username, email: email.email })
    });

    return list
  }

  emails() {
    return this.hasMany('App/Models/Email')
  }
}

module.exports = User

控制器:

...

let user = await User.find(1)
return await user.getEmails()

输出:

[
   {"name":"CrBast","email":"test@crbast.ch"},
   {"name":"CrBast","email":"test2@crbast.ch"}
]

如果这不是你想要的,请随时纠正我:)

对于自定义的 JSON 响应,我建议使用序列化程序。 您可以覆盖默认的序列化程序以获得所需的结果。

你可以参考这个 - https://adonisjs.com/docs/4.0/serializers