【问题标题】:PostgreSQL DB query with Fluent 4使用 Fluent 4 进行 PostgreSQL 数据库查询
【发布时间】:2022-01-21 16:27:23
【问题描述】:

具有以下功能的 Fluent Data 查询有效:

func indexHandler(_ req: Request) -> EventLoopFuture<[CustomerWithOrders]> {
    Customer
        .query(on: req.db)
        .with(\.$orders)
        .all()
        .map { customers in
            customers.map { customer in
            let customerOrders = customer.orders.map {
                OrderOnly(id: $0.id, date: $0.date)
            }
            return CustomerWithOrders(
                id: customer.id, 
                name: customer.name, 
                orders: customerOrders
            )
        }             
    }
}
struct OrderOnly: Content {
    let id: UUID?
    let date: Date
}

struct CustomerWithOrders: Content {
    let id: UUID?
    let name: String
    let orders: [OrderOnly]
}

但不是在交换之后:[CustomerWithOrders]View in EventLoopFuture

func indexHandler(_ req: Request) -> EventLoopFuture<View> {
    Customer
        .query(on: req.db)
        .with(\.$orders)
        .all()
        .map { customers in //Type of expression is ambiguous without more context
            customers.map { customer in
                let customerOrders = customer.orders.map {
                    OrderOnly(id: $0.id, date: $0.date)
                }    
                let context = IndexContextcwo(
                    id: customer.id,
                    name: customer.name,
                    orders: customerOrders
                )    
                return req.leaf.render("home", context)
            }               
        }
}
struct IndexContextcwo: Encodable {
    let id: UUID?
    let name: String
    let orders: [OrderOnly]?
}

我怎样才能摆脱错误Type of expression is ambiguous without more context" in the row ".all().map

感谢您的提示。

感谢您的回答。

随着从地图更改为平面地图,我没有进一步的了解。现在一个错误是:

“EventLoopF​​uture”类型的值没有成员“flatmap”

以下是项目中的一些文件:

网站控制器.swift:

import Vapor
import Leaf
import Fluent
import FluentPostgresDriver

struct WebSiteController: RouteCollection {
func boot(routes: RoutesBuilder) throws {
    routes.get(use: indexHandler)
}

func indexHandler(_ req: Request)
-> EventLoopFuture<View> {
    
    Customer.query(on: req.db).with(\.$orders)
        .all().map { customers in
         customers.map { customer in
         let customerOrders = customer.orders.map {
         OrderOnly(id: $0.id, date: $0.date)
         }                  
           let context = IndexContextcwo(id: customer.id, name: customer.name, orders: customerOrders)                
           return req.leaf.render("home", context)
    }
 }
    
    //Test without Custommer.query ...:
    //return req.leaf.render("home")
  }

}

struct OrderOnly: Content {
let id: UUID?
let date: Date
}

struct CustomerWithOrders: Content {
let id: UUID?
let name: String
let orders: [OrderOnly]
}

struct IndexContextcwo: Encodable {
let id: UUID?
let name: String
let orders: [OrderOnly]?
}

型号:

客户.swift:

import Foundation
import Vapor
import Fluent
import FluentPostgresDriver

final class Customer: Model, Content {
static let schema = "customers"

@ID
var id: UUID?

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

@Siblings(through: OrderCustomerPivot.self, from: \.$customer, to: \.$order)
var orders: [Order]

init() {}

init(id: UUID? = nil, name: String) {
self.id = id
self.name = name
 }
}

Order.swift:

import Foundation
import Vapor
import Fluent
import FluentPostgresDriver

final class Order: Model {
static let schema = "orders"

@ID
var id: UUID?

@Field(key: "date")
var date: Date

@Siblings(through: OrderCustomerPivot.self, from: \.$order, to: \.$customer)
var customers: [Customer]

init() {}

init(id: UUID? = nil, date: Date) {
self.id = id
self.date = date
 }
}

extension Order: Content {}

OrderCustomerPivot.swift

import Foundation
import Fluent

final class OrderCustomerPivot: Model {
static let schema = "order-customer-pivot"

@ID
var id: UUID?

@Parent(key: "orderID")
var order: Order

@Parent(key: "customerID")
var customer: Customer

init() {}

init(id: UUID? = nil, order: Order, customer: Customer) throws {
self.id = id
self.$order.id = try order.requireID()
self.$customer.id = try customer.requireID()
 }
}

【问题讨论】:

  • 欢迎来到 SO。如果我的回答对你有帮助,请采纳。

标签: swift fluent vapor


【解决方案1】:

您收到错误的原因是因为.map 意味着您的代码预计将返回相同类型的未来,即[CustomerWithOrders]。这在第一种情况下显然是正确的,但是当您进行更改以返回未来 View 时,它不再是。

从检查您的代码开始,我认为将第一个 .map 更改为 .flatMap 应该可以解决问题。这表示您将返回一个不同的未来,这就是您想要的。

【讨论】:

  • 这是正确的。第二个map 是数组map 不是未来地图
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多