Postgresql 与使用Slick 3.2.1(Scala)中过滤器的where条款类似

Postgresql 与使用Slick 3.2.1(Scala)中过滤器的where条款类似,postgresql,scala,intellij-idea,slick,Postgresql,Scala,Intellij Idea,Slick,我还是一个相当新的滑头和非常多的学习 我正在尝试创建一个搜索功能,使用纯SQL非常简单。然而,当我试图用Slick做同样的事情时,我遇到了一些障碍 试着从这里举例: 我开始构建一个函数,如下所示: private def schoolSearchBaseQuery(drop: Long, take: Long) = { (for { schools <- Schools.schools.filter(_.deletedAt.isEmpty) } yield sc

我还是一个相当新的滑头和非常多的学习

我正在尝试创建一个搜索功能,使用纯SQL非常简单。然而,当我试图用Slick做同样的事情时,我遇到了一些障碍

试着从这里举例: 我开始构建一个函数,如下所示:

private def schoolSearchBaseQuery(drop: Long, take: Long) = {
    (for {
      schools <- Schools.schools.filter(_.deletedAt.isEmpty)
    } yield schools).drop(drop).take(take)
  }

  def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] = {
    val q = schoolSearchBaseQuery(drop, take) filter { school =>
      List(
        schoolSearchCriteria.name.map(n => school.name like s"%$n%")
      )
    }

    db.run(q.result)
  }
标准最终将比单一领域更加复杂。我只是想弄清楚目前的机制

考虑到基本查询最终将包含多个表或甚至一个联接,创建这样的搜索查询的方向是否正确?

此代码编译:

  def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] = {
    val q = schoolSearchBaseQuery(drop, take) filter { school =>
      val n = schoolSearchCriteria.name.get
      school.name like s"%$n%"
    }

    db.run(q.result)
  }


此代码编译:

  def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] = {
    val q = schoolSearchBaseQuery(drop, take) filter { school =>
      val n = schoolSearchCriteria.name.get
      school.name like s"%$n%"
    }

    db.run(q.result)
  }



所以,我想,我也应该在这里回答我自己的问题,因为看起来我已经解决了这个问题。 显然,我在这里的例子中遗漏了什么: 是
收集
部分的重要性

因此,最终我的工作方式是:

def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] = {
    val q = schoolSearchBaseQuery(drop, take) filter { school =>
      List(
        schoolSearchCriteria.name.map(n => school.name like s"%${n.toLowerCase}%")
      ).collect({case Some(criteria)  => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
    }

    db.run(q.result)
  }
但是,我不能100%确定这是怎么回事:)
我希望这能帮助别人

所以,我想,我也应该在这里回答我自己的问题,因为看起来我已经解决了这个问题。 显然,我在这里的例子中遗漏了什么: 是
收集
部分的重要性

因此,最终我的工作方式是:

def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] = {
    val q = schoolSearchBaseQuery(drop, take) filter { school =>
      List(
        schoolSearchCriteria.name.map(n => school.name like s"%${n.toLowerCase}%")
      ).collect({case Some(criteria)  => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
    }

    db.run(q.result)
  }
但是,我不能100%确定这是怎么回事:)
我希望这能帮助别人

不知道你的类型很难回答你的问题。顺便说一句,
用于{x@DmytroMitin添加了更多细节。我想这就是我们所缺少的。除非你指的是其他类型。至于你的其他注释,我知道,但这在不久的将来会变得更复杂。不是所有。
学校
学校。学校
。更新。添加了所有内容。不知道你的类型很难回答你的问题。顺便说一句,
用于{x@DmytroMitin添加了更多的细节。我想这就是所缺少的。除非你指的是其他类型。至于你的其他注释,我知道,但这在不久的将来会变得更复杂。不是所有的。
Schools
Schools.Schools
。更新。添加了整个内容。我希望不会过滤任何东西。那么概念上的变化是什么呢你的建议和我做的有什么不同?我只是在有
schoolSearchCriteria的情况下添加过滤器。name
是一些(…)我更新了答案。“不过滤任何东西”可以是不同的,未来可以是成功的,也可以是失败的。不同的是你的代码没有编译。我又添加了一个变体。现在我想这就是你想要的。如果
则没有过滤。是的,这一个非常简单。但是,如果我需要的标准中有20个可选字段,那么处理它的最佳方法是什么d需要考虑吗?下面的例子是:它应该按照我最初尝试的方式工作。我希望不过滤任何东西。那么,你的建议和我所做的之间在概念上有什么区别呢?我只是在有
schoolSearchCriteria的情况下添加过滤器。name
是一些(…)我更新了答案。“不过滤任何东西”可以是不同的,未来可以是成功的,也可以是失败的。不同的是你的代码没有编译。我又添加了一个变体。现在我想这就是你想要的。如果
则没有过滤。是的,这一个非常简单。但是,如果我需要的标准中有20个可选字段,那么处理它的最佳方法是什么d需要考虑吗?下面的示例是:它应该按照我最初尝试的方式工作。您可以简化:
val q=schoolSearchBaseQuery(drop,take)filter{school=>schoolSearchCriteria.name.map(n=>school.name,如s“%$${n.toLowerCase}%”)。getOrElse(true:Rep[Boolean])
您可以简化:
val q=schoolsearchbashBaseQuery(拖放)筛选器{school=>schoolSearchCriteria.name.map(n=>school.name,如s“%${n.toLowerCase}%”)。getOrElse(true:Rep[Boolean])}
  def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] =
    schoolSearchCriteria.name.map { n =>
      val q = schoolSearchBaseQuery(drop, take) filter { school =>
        school.name like s"%$n%"
      }
      db.run(q.result)
    }.getOrElse {
      Future.failed(new Exception("no name"))
//      Future.successful(Seq())
    }
def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] = {
    val q0 = schoolSearchBaseQuery(drop, take)
    val q1 = schoolSearchCriteria.name.map { n =>
      q0 filter { school =>
        school.name like s"%$n%"
      }
    }.getOrElse(q0)

    db.run(q1.result)
  }
def search(schoolSearchCriteria: SchoolSearchCriteria, drop: Long = 0, take: Long = 100): Future[Seq[School]] = {
    val q = schoolSearchBaseQuery(drop, take) filter { school =>
      List(
        schoolSearchCriteria.name.map(n => school.name like s"%${n.toLowerCase}%")
      ).collect({case Some(criteria)  => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
    }

    db.run(q.result)
  }