我正在使用Xcode 11.2
和Vapor3
和Fluent
在SQLite
中编写一个后端应用程序。我有一个POST
请求的路由,用于更新Table1中的记录,但是在保存记录之前,我需要使用传递的字段之一中的键从另一个表中提取值。我遇到的问题是从另一个表访问该数据。
到目前为止我所拥有的:
员工表
final class Staff: Content, SQLiteUUIDModel, Migration, Parameter {
var id: UUID?
var staffID: String (value that's in the other table to match)
var value1: Int (one of the values I'm trying to fetch)
var value2: Int (another value I'm trying to fetch)
...(additional variables and Init
分配表
final class Assignments: Content, SQLiteUUIDModel, Migration, Parameter {
var id: UUID?
var staffID: String
...(additional variables and Init
路由传入POST请求以更新现有分配:
router.post("update", Assignments.parameter) { req -> Future<Assignments> in
return try req.parameters.next(Assignments.self).flatMap { Assignment in
return try req.content.decode(Assignments.self).flatMap { updatedAssignment in
(Code where I perform calculations on the incoming 'Assignment' and save to 'updatedAssignment' before calling:)
return WorkOrder.save(on: req)
我使用的路由有效,修改了传入数据并将其写入SQLite数据库,但是我需要对几个字段进行计算或将其设置为Staff表中存储的值。 IE:
editedAssignment.variable = (variable) * (value1 from staff table for matching staffID)
editedAssignment.variable = (value2 from staff table for matching staffID)
到目前为止我尝试过的事情
let staffData = Staff.query(on: req).filter(\.staffID == staffID).all() before the calculations
(adding as a Future as:)
router.post(...) { req -> Future<Staff> in return try Staff.query(on: req).filter ...(rest of query)
-此方法引发整个请求,传入请求的值只会丢失。
理想情况下,如果我可以在计算中调用查询并将其另存为字典,那将是理想的选择,我似乎无法“弄清楚”。
答案 0 :(得分:1)
您需要将其放入路线中,以使其成为链的一部分,而不是像您原来的那样脱节:
router.post("update", Assignments.parameter) {
req -> Future<Assignments> in
return try req.parameters.next(Assignments.self).flatMap {
assignment in
return try req.content.decode(Assignments.self).flatMap {
updatedAssignment in
return Staff.query(on: req).filter(\.staffID == staffID).first().flatMap {
staffData in
/* Code to update 'updatedAssignment' */
return WorkOrder.save(on: req)
}
}
}
}
您很可能会遇到编译器错误,需要输入显式的返回类型,但是我无法预测/测试这些类型。我已经把它留了下来,但是我不认为这是一个好主意,当您最终返回Future<Assignments>
的返回值时,您明确声明将返回WorkOrder.save...
。