【发布时间】:2021-07-16 20:25:53
【问题描述】:
我一直在努力解决如何通过包含额外字段的数据透视表返回包含多对多关系的模型。基本上,我想返回带有额外字段的完整数据透视表,但我不知道该怎么做。
让我们考虑以下 3 个模型:Course、User,以及它们之间的枢纽 Student。 Student 模型包含额外字段 progress。
final class Course: Model, Content {
static let schema = "courses"
@ID(key: .id)
var id: UUID?
@Field(key: "name")
var name: String
init() { }
}
final class Student: Model {
static let schema = "students"
@ID(key: .id)
var id: UUID?
@Parent(key: "course_id")
var course: Course
@Parent(key: "user_id")
var user: User
@Field(key: "progress")
var progress: Int
init() { }
}
final class User: Model, Content {
static let schema = "users"
@ID(key: .id)
var id: UUID?
@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()
.get()
}
生成的 JSON 如下所示:
[
{
"id": 1,
"name": "Course 1"
}
]
我怎样才能也包括学生数组,以便最终结果是这样的?
[
{
"id": 1,
"name": "Course 1",
"students": [
{
"user": {
"id": 1,
"name": "User 1"
},
"progress": 0
},
{
"user": {
"id": 2,
"name": "User 2"
},
"progress": 100
},
]
]
我可以像这样将用户添加到Course 模型中:
@Siblings(through: Student.self, from: \.$course, to: \.$user)
public var users: [User]
然后像这样改变我的路线:
func list(req: Request) throws -> EventLoopFuture<[Course]> {
return Course
.query(on: req.db)
.with(\.$user)
.all()
.get()
}
但这只会将用户信息添加到结果中,而不是数据透视表上的额外属性(即progress)。在我看来,即使数据透视表可以有额外的属性并且文档甚至特别指出了这一点,但实际上没有很好的方法来处理这种情况,因为@Siblings 根本不指向数据透视表。
额外问题:我希望将 User 模型映射到 PublicUser 模型,以便私有/内部字段不是 JSON 结果的一部分。我的意思见this question。我想做同样的事情,但使用 Student 数据中心的 User 模型。复杂的,我知道????
【问题讨论】:
标签: swift vapor vapor-fluent