Return 儿童和兄弟姐妹价值观的回应
Return Children and Siblings values in response
这可能是一个小问题,但我无法解决,也没有找到答案。
我有 3 个相互关联的表,作为父子和兄弟姐妹。我想 return 一些值形成所有表和相同的 JSON 响应。
final class ClimbingGym: Model, Content {
static let schema = "climbing_gyms"
@ID(key: .id)
var id: UUID?
@Field(key: "name")
var name: String
@Field(key: "description")
var description: String
@Siblings(through: ClimbingDisciplineClimbingGym.self, from: \.$gym, to: \.$discipline)
var disciplines: [ClimbingDiscipline]
@Children(for: \.$gym)
var socialNetworks: [SocialNetwork]
init() { }
init(
id: UUID? = nil,
name: String,
description: String,
) {
self.id = id
self.name = name
self.description = description
}
}
enum ClimbingDisciplineType: String, Codable, CaseIterable, Equatable {
static let schema = "climbing_discipline_type"
case lead
case boulder
case speed
}
final class ClimbingDiscipline: Model, Content {
static let schema = "climbing_disciplines"
@ID(key: .id)
var id: UUID?
@Enum(key: "type")
var type: ClimbingDisciplineType
init() { }
init(
id: UUID? = nil,
type: ClimbingDisciplineType
) {
self.id = id
self.type = type
}
}
final class SocialNetwork {
static let schema = "social_networks"
@ID(key: .id)
var id: UUID?
@Field(key: "link")
var link: String
@Parent(key: "gym_id")
var gym: ClimbingGym
init() { }
init(
id: UUID? = nil,
link: String,
gym: ClimbingGym
) throws {
self.id = id
self.link = link
self.$gym.id = try gym.requireID()
}
}
我想return那个型号:
struct ClimbingGymResponse: Codable, Content {
let id: UUID
let name: String
let description: String
let disciplines: [ClimbingDisciplineType]
let socialNetworks: [String]
}
所以我现在使用的查询看起来像这样
func getAll(req: Request) throws -> EventLoopFuture<[ClimbingGymResponse]> {
ClimbingGym
.query(on: req.db)
.join(children: \ClimbingGym.$socialNetworks)
.join(siblings: \ClimbingGym.$disciplines)
.all()
}
它显然不起作用,因为它 returns [ClimbingGym]
而不是 [ClimbingGymResponse]
.
那么我怎样才能将一个转换成另一个呢?
我在为每个体育馆
填写 disciplines: [ClimbingDisciplineType]
和 socialNetworks: [String]
字段时遇到问题
谢谢!
您可以将结果数组映射到您想要的类型。所以
ClimbingGym
.query(on: req.db)
.with(\.$socialNetworks)
.with(\.$disciplines)
.all().flatMapThrowing { gyms in
try gyms.map { try ClimbingGymResponse(id: [=10=].requireID(), ...) }
}
这可能是一个小问题,但我无法解决,也没有找到答案。
我有 3 个相互关联的表,作为父子和兄弟姐妹。我想 return 一些值形成所有表和相同的 JSON 响应。
final class ClimbingGym: Model, Content {
static let schema = "climbing_gyms"
@ID(key: .id)
var id: UUID?
@Field(key: "name")
var name: String
@Field(key: "description")
var description: String
@Siblings(through: ClimbingDisciplineClimbingGym.self, from: \.$gym, to: \.$discipline)
var disciplines: [ClimbingDiscipline]
@Children(for: \.$gym)
var socialNetworks: [SocialNetwork]
init() { }
init(
id: UUID? = nil,
name: String,
description: String,
) {
self.id = id
self.name = name
self.description = description
}
}
enum ClimbingDisciplineType: String, Codable, CaseIterable, Equatable {
static let schema = "climbing_discipline_type"
case lead
case boulder
case speed
}
final class ClimbingDiscipline: Model, Content {
static let schema = "climbing_disciplines"
@ID(key: .id)
var id: UUID?
@Enum(key: "type")
var type: ClimbingDisciplineType
init() { }
init(
id: UUID? = nil,
type: ClimbingDisciplineType
) {
self.id = id
self.type = type
}
}
final class SocialNetwork {
static let schema = "social_networks"
@ID(key: .id)
var id: UUID?
@Field(key: "link")
var link: String
@Parent(key: "gym_id")
var gym: ClimbingGym
init() { }
init(
id: UUID? = nil,
link: String,
gym: ClimbingGym
) throws {
self.id = id
self.link = link
self.$gym.id = try gym.requireID()
}
}
我想return那个型号:
struct ClimbingGymResponse: Codable, Content {
let id: UUID
let name: String
let description: String
let disciplines: [ClimbingDisciplineType]
let socialNetworks: [String]
}
所以我现在使用的查询看起来像这样
func getAll(req: Request) throws -> EventLoopFuture<[ClimbingGymResponse]> {
ClimbingGym
.query(on: req.db)
.join(children: \ClimbingGym.$socialNetworks)
.join(siblings: \ClimbingGym.$disciplines)
.all()
}
它显然不起作用,因为它 returns [ClimbingGym]
而不是 [ClimbingGymResponse]
.
那么我怎样才能将一个转换成另一个呢?
我在为每个体育馆
disciplines: [ClimbingDisciplineType]
和 socialNetworks: [String]
字段时遇到问题
谢谢!
您可以将结果数组映射到您想要的类型。所以
ClimbingGym
.query(on: req.db)
.with(\.$socialNetworks)
.with(\.$disciplines)
.all().flatMapThrowing { gyms in
try gyms.map { try ClimbingGymResponse(id: [=10=].requireID(), ...) }
}