Postgresql 与使用Slick 3.2.1(Scala)中过滤器的where条款类似
我还是一个相当新的滑头和非常多的学习 我正在尝试创建一个搜索功能,使用纯SQL非常简单。然而,当我试图用Slick做同样的事情时,我遇到了一些障碍 试着从这里举例: 我开始构建一个函数,如下所示: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
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)
}