2

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

假设我有一个Email的User模型。hasMany

我怎样才能只附加来自 User 模型的第一封电子邮件的电子邮件以便每次查询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:我不会将电子邮件放在同一张桌子上,因为在很长一段时间内,用户可能需要不止一封电子邮件,但现在,它只有一封。

我怎样才能做到这一点?

4

2 回答 2

1

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

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

于 2020-03-19T07:08:47.017 回答
0

这是我的代码。你可能会受到启发:

型号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"}
]

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

于 2019-11-20T21:33:34.640 回答