我正在为如何返回包含父关系的模型而苦苦挣扎,同时将急切加载的模型映射到不同的形式。
让我们考虑以下 2 个模型:Course
和User
。
final class Course: Model, Content {
static let schema = "courses"
@ID(key: .id)
var id: UUID?
@Field(key: "name")
var name: String
@Parent(key: "teacher_id")
var teacher: User
init() { }
}
final class User: Model, Content {
static let schema = "users"
@ID(key: .id)
var id: UUID?
@OptionalField(key: "avatar")
var avatar: String?
@Field(key: "name")
var name: String
@Field(key: "private")
var somePrivateField: String
init() { }
}
我有一条这样的路线,它返回一系列课程:
func list(req: Request) throws -> EventLoopFuture<[Course]> {
return Course
.query(on: req.db)
.all()
}
生成的 JSON 如下所示:
[
{
"id": 1,
"name": "Course 1",
"teacher": {
"id": 1
}
]
相反,我想要的是返回教师对象,这很容易通过添加.with(\.$teacher)
到查询中。Vapor 4 确实让这变得非常简单!
[
{
"id": 1,
"name": "Course 1",
"teacher": {
"id": 1,
"name": "User 1",
"avatar": "https://www.example.com/avatar.jpg",
"somePrivateField": "super secret internal info"
}
]
我的问题User
是:返回整个对象,包括所有字段,甚至是我不想公开的字段。
将教师信息转换为不同版本的User
模型的最简单方法是什么,例如PublicUser
?这是否意味着我必须为 制作一个 DTO Course
,将我的数组从 映射[Course]
到[PublicCourse]
,复制所有属性,在模型更改时使它们保持同步Course
等?
这似乎是很多样板,未来有很大的错误空间。很想听听是否有更好的选择。