gpt4 book ai didi

swift - Vapor 4 : Children relation not eager loaded, 使用 $ 前缀访问

转载 作者:行者123 更新时间:2023-12-04 08:43:37 29 4
gpt4 key购买 nike

目前我正在做一项学校作业,我们必须使用 Vapor 构建 API。我有一些基本的 API 调用在工作,我现在正在尝试更高级的 API 调用,但我无法让它工作。
我有这个功能 addToParty当 URL /party/join/:partyID 被调用时被称为 body

{
"id": "CC1FAC6B-A2B3-471C-A488-147300196981",
"username": "string",
"is_ready": true
}
我正在尝试通过 partyId 查找聚会并将该用户添加到该聚会的用户列表中。
func addToParty (req: Request) throws -> EventLoopFuture<Party.Output> {
guard let id = req.parameters.get("partyID", as: UUID.self) else {
throw Abort(.badRequest)
}
let input = try req.content.decode(Party.JoinParty.self)
return Party.find(id, on: req.db)
.unwrap(or: Abort(.notFound))
.flatMap { element in
element.users.append(User(id: UUID(input.id), username: input.username, is_ready: input.is_ready))
return element.save(on: req.db)
.map{ Party.Output(code: "200") }
}
}
当我尝试上面的代码时,我收到错误 Fatal error: Children relation not eager loaded, use $ prefix to access: Children<Party, User>(for: [party_id]): file FluentKit/Children.swift, line 33从线
element.users.append(User(id: UUID(input.id), username: input.username, is_ready: input.is_ready))
当我评论这一行时,代码运行并得到一个返回码。
我尝试将前缀添加到 element.$users$User但随后它提示找不到 element.$users$User在适用范围。 Party model
import Fluent
import Vapor

final class Party: Model, Content {
static let schema = "parties"

struct JoinParty: Content {
let id: String
let username: String
let is_ready: Bool
}

struct Output: Content {
let code: String
}

@ID(key: .id)
var id: UUID?

@Field(key: "party_code")
var party_code: String

@Field(key: "host_id")
var host_id: UUID

@Field(key: "is_active")
var is_active: Bool

// change to Game when model is made
@Field(key: "selected_games")
var selected_games: [String]?

// change to Setting when model is made
@Field(key: "settings")
var settings: String

@Field(key: "results")
var results: Array<GameResult>?

@Children(for: \.$party)
var users: [User]

init() { }

init(id: UUID? = nil,
party_code: String,
host_id: UUID,
is_active: Bool,
selected_games: [String]? = nil,
settings: String,
results: Array<GameResult>? = nil) {
self.id = id
self.party_code = party_code
self.host_id = host_id
self.is_active = is_active
self.selected_games = selected_games
self.settings = settings
self.results = results
}
}
User model
import Fluent
import Vapor

final class User: Model, Content {
static let schema = "users"

struct Input: Content {
let id: UUID
let username: String
}

struct Output: Content {
let id: String
let username: String
}

@ID(key: .id)
var id: UUID?

@Field(key: "username")
var username: String

@Field(key: "is_ready")
var is_ready: Bool

@OptionalParent(key: "party_id")
var party: Party?

@Children(for: \.$user)
var gameResults: [GameResult]

init() {}

init(id: UUID? = nil, username: String, is_ready: Bool, partyID: UUID? = nil) {
self.id = id
self.username = username
self.is_ready = is_ready
self.$party.id = partyID
}
}
我有一个类似的功能来更新一个已经工作的用户的用户名,这几乎是一样的。
func update(req: Request) throws -> EventLoopFuture<User.Output> {
let input = try req.content.decode(User.Input.self)
return User.find(input.id, on: req.db)
.unwrap(or: Abort(.notFound))
.flatMap { user in
user.username = input.username
return user.save(on: req.db)
.map { User.Output(id: user.id!.uuidString, username: user.username) }
}
}
任何帮助将非常感激。
先感谢您。

最佳答案

不幸的是,将 child 添加到父模型还不是那么直观。我希望有一天我们可以添加它,但它还没有。流利 5 也许?
无论如何,您需要做的是创建新的 User模型,将当事人的 ID 值传递给 partyID初始化参数,然后保存User模型。

let user = User(id: UUID(input.id), username: input.username, is_ready: input.is_ready, partyID: element.id)
return user.save(on: request.db)
所以你的方法最终应该是这样的:
func addToParty(req: Request) throws -> EventLoopFuture<Party.Output> {
guard let id = req.parameters.get("partyID", as: UUID.self) else {
throw Abort(.badRequest)
}
let input = try req.content.decode(Party.JoinParty.self)

return Party.find(id, on: req.db).unwrap(or: Abort(.notFound)).flatMap { element in
return User(
id: UUID(input.id),
username: input.username,
is_ready: input.is_ready,
partyID: element.id
).save(on: req.db)
}.transform(to: Party.Output(code: "200"))
}

关于swift - Vapor 4 : Children relation not eager loaded, 使用 $ 前缀访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64441909/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com