Vapor 4 不区分大小写的查询

Rod*_*igo 4 fluent swift vapor vapor-fluent

在 Vapor 3 中,您可以使用filter带有 SQLiteBinaryOperator 的方法,因此您可以使用类似运算符创建查询。我正在尝试在 Vapor 4 中做完全相同的事情,但找不到任何东西。这是我的代码

蒸气 4

func queryUserMovies(_ req: Request) throws -> Future<[Users]> {
    let title = req.parameters.get("title")!
    return Movies.query(on: req.db).filter(\.$title == title).first().unwrap(or:Abort(.notFound, reason: "There's no movie")).flatMap{ movie in
        return movie.$users.query(on: req.db).all()
    }
}
Run Code Online (Sandbox Code Playgroud)

蒸气 3

func queryUserMovies(_ req: Request) throws -> Future<[Users]> {
    guard let movie = req.query[String.self, at: "movie"] else {
        throw Abort(.badRequest, reason: "Not such movie")
    }
    return Movies.query(on: req).filter(\.title, .like, movie).first().unwrap(or:Abort(.notFound, reason: "There's no movie")).flatMap{ movie in
        return movie.users.query(on: req).all()
    }
}
Run Code Online (Sandbox Code Playgroud)

Vapor 4 中是否有类似的内容,或者我是否需要在 SQL 中执行原始查询?

0xT*_*Tim 7

Vapor 4 中的等价物是:

func queryUserMovies(_ req: Request) throws -> Future<[Users]> {
    let title = try req.query.get(String.self, at: "title")
    return Movies.query(on: req.db)
        .filter(\.$title, .custom("ilike"), title)
        .first()
        .unwrap(or:Abort(.notFound, reason: "There's no movie"))
        .flatMap{ movie in
            return movie.$users.query(on: req.db).all()
    }
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以执行更广泛的搜索以找到包含该标题的任何内容:

.filter(\.$title, .custom("ilike"), "%\(title)%")
Run Code Online (Sandbox Code Playgroud)

  • 是的,[参见这个答案](/sf/answers/4458196851/)至于为什么 (2认同)