Почему я не могу использовать фильтр в настраиваемом контроллере с Vapor 4? - PullRequest
0 голосов
/ 04 августа 2020

Я хочу добавить маршрут для получения сопоставленных данных путем поиска определенной строки c. Я добавил маршрут в routes(_:) в routes.swift .

import Fluent
import Vapor

func routes(_ app: Application) throws {
  // route "api/acronyms/search?term=The+string+searched
  app.get("search") { req -> EventLoopFuture<[Acronym]> in
    guard let searchTerm = req.query[String.self, at: "term"] else {
      throw Abort(.badRequest)
    }

    return Acronym.query(on: app.db)
      .group(.or) { group in
        group
          .filter(\.$short == searchTerm)
          .filter(\.$long == searchTerm)
      }
      .all()
  }
}

И это работает. Я хочу переместить его в контроллер. Итак, я создал функцию-обработчик в контроллере.

import Vapor
import Fluent

struct AcronymsController: RouteCollection {
  let app: Application

  func boot(routes: RoutesBuilder) throws {
    routes.get("search", use: search)
  }
  
  func search(req: Request) throws -> EventLoopFuture<[Acronym]> {
    guard let searchTerm = req.query[String.self, at: "term"] else {
            throw Abort(.badRequest)
          }

          return Acronym.query(on: app.db)
            .filter(\Acronym.$short == searchTerm)
            .filter(\Acronym.$long == searchTerm)
            .all()
  }
}

Но я получил ошибку компилятора Swift: Binary operator '==' cannot be applied to operands of type 'KeyPath<Acronym, FieldProperty<Acronym, String>>' and 'String'.

Почему filter с оператором == не работает в контроллер?

Окружающая среда

  • Vapor 4.27.1 (набор инструментов 18.2.1)
  • Swift 5.2.4
  • macOS Catalina 10.15.6

1 Ответ

1 голос
/ 06 августа 2020

Вам необходимо import Fluent в файле контроллера, чтобы компилятор мог видеть, что перегрузки оператора запускают запрос

...