如何解决蒸气4不区分大小写的查询
在Vapor 3中,您可以将Promise
方法与sqliteBinaryOperator结合使用,因此可以使用like运算符创建查询。我正在尝试在Vapor 4中做完全相同的事情,但是找不到任何东西。
这是我的代码
蒸气4
filter
蒸气3
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()
}
}
Vapor 4中是否有类似功能?还是需要在sql中执行原始查询?
解决方法
蒸气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()
}
}
您甚至可以进行更广泛的搜索以查找包含该标题的任何内容:
.filter(\.$title,"%\(title)%")
,
我只是遇到了同样的问题,但还有一个障碍!
该设置是一个 Machine 关系和一个 Category 关系,我想在 Machine.name中搜索一个或多个搜索词的出现和 Category.name 带有一个表达式。
(机器和类别关系都具有 name 属性。)
search 的类型为 [String.SubSequence] ,因此我们可以迭代多个搜索词关键字,这些关键字必须全部出现在名称中。 / p>
我的解决方法是:
return Machine
.query(on: req.db)
.join(Category.self,on: \Category.$id == \Machine.$category.$id)
// For each search-term the must be at least one fit with Machine.name and/or Category.name
.group(.and) {
var result = $0
for term in search.map({ "%\(String($0))%" }) {
// One or both must fit the search-term ...
result = result.group(.or) {
$0
// Does the Machine name fit?
.filter(\Machine.$name,term)
// Does the Category.path name fit?
.filter(
DatabaseQuery.Field.path(
Category.path(for: \Category.$name),schema: Category.schema
),DatabaseQuery.Filter.Method.custom("ilike"),DatabaseQuery.Value.bind(term)
)
}
}
}
如您所见,有两个 .group(...)函数。外部组( .or )说“对于每个搜索词,必须有一个合适的内部组规则”,而内部组( .or )说“必须存在一个租用合适的Machine.name或Category.name”。
由于 .custom(“ ilike”)不被“ joined-relation-filter”支持,因此我使用了发现的here解决方法。
即使很难回答这个问题,我也花了一些时间弄清楚这个问题,并认为可以在这里分享。
,有一个包含运算符~~,可用于此操作:
Movie.query(on: req).filter(\.$title ~~ movie)
不区分大小写。
,如果要进行不区分大小写的排序,可以执行以下操作:
Movie.query(on: req).sort(.custom("lower(title)"))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。