手动修改 vapor 4 响应中的模型 属性 值
Manually modifying model property values in vapor 4 response
我有一个 vapor 4 应用程序。我从数据库中查询以获取一些项目,我想在完成请求之前根据返回值执行一些手动计算。这是我想要实现的示例代码。
final class Todo: Model, Content {
static var schema: String = "todos"
@ID(custom: .id)
var id: Int?
@Field(key: "title")
var title: String
var someValue: Int?
}
/// Allows `Todo` to be used as a dynamic migration.
struct CreateTodo: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema(Todo.schema)
.field("id", .int, .identifier(auto: true))
.field("title", .string, .required)
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema(Todo.schema).delete()
}
}
final class TodoController:RouteCollection{
func boot(routes: RoutesBuilder) throws {
routes.get("tmp", use: temp)
}
func temp(_ req:Request) throws -> EventLoopFuture<[Todo]> {
Todo.query(on: req.db).all().map { todos in
todos.map {
[=12=].someValue = (0...10).randomElement()!
return [=12=]
}
}
}
}
问题是这些手动更改在响应中不可用。在这种情况下 someValue
属性.
谢谢。
[
{
"title": "item 1",
"id": 1
},
{
"title": "item 2",
"id": 2
}
]
您遇到的问题是 Model
覆盖了 Codable
实现。这允许你做一些事情,比如绕过 parents 而不是添加 children 等
但是,这打破了你的情况。你应该做的是创建一个新类型,如果你想 return a Todo
与另一个未存储在数据库中的字段,例如:
struct TodoResponse: Content {
let id: Int
let title: String
let someValue: Int
}
然后在路由处理程序中将数据库类型转换为响应类型(这是一种非常常见的模式,也是在 Vapor 中推荐的做法)
我有一个 vapor 4 应用程序。我从数据库中查询以获取一些项目,我想在完成请求之前根据返回值执行一些手动计算。这是我想要实现的示例代码。
final class Todo: Model, Content {
static var schema: String = "todos"
@ID(custom: .id)
var id: Int?
@Field(key: "title")
var title: String
var someValue: Int?
}
/// Allows `Todo` to be used as a dynamic migration.
struct CreateTodo: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema(Todo.schema)
.field("id", .int, .identifier(auto: true))
.field("title", .string, .required)
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema(Todo.schema).delete()
}
}
final class TodoController:RouteCollection{
func boot(routes: RoutesBuilder) throws {
routes.get("tmp", use: temp)
}
func temp(_ req:Request) throws -> EventLoopFuture<[Todo]> {
Todo.query(on: req.db).all().map { todos in
todos.map {
[=12=].someValue = (0...10).randomElement()!
return [=12=]
}
}
}
}
问题是这些手动更改在响应中不可用。在这种情况下 someValue
属性.
谢谢。
[
{
"title": "item 1",
"id": 1
},
{
"title": "item 2",
"id": 2
}
]
您遇到的问题是 Model
覆盖了 Codable
实现。这允许你做一些事情,比如绕过 parents 而不是添加 children 等
但是,这打破了你的情况。你应该做的是创建一个新类型,如果你想 return a Todo
与另一个未存储在数据库中的字段,例如:
struct TodoResponse: Content {
let id: Int
let title: String
let someValue: Int
}
然后在路由处理程序中将数据库类型转换为响应类型(这是一种非常常见的模式,也是在 Vapor 中推荐的做法)