微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

蒸气4不区分大小写的查询

如何解决蒸气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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?