用于理解 Slick Query 的 Scala
Scala for comprehension for Slick Query
我是 Scala 的新手,我正在构建一个 Play 应用程序来学习 Scala 和 Slick。该应用程序有待办事项列表,每个列表都有项目。每个用户都有多个列表。我写了一个控制器来获取列表 JSON,并且 JSON 包括列表中的所有项目。
def viewList(id: Long) = AuthenticatedAction.async { implicit request =>
val userId = request.user.toLong;
db.run(todoLists.filter(listById(id, userId)).result.headOption).flatMap { list =>
list match {
case Some(_) => {
val json = toJson(list).as[JsObject]
// Fetch the items in this list and add them to the JSON response
db.run(todoItems.filter(_.listId === id).sortBy(_.text).result).map { items =>
Ok(json + ("items" -> toJson(items)))
}
}
case None => Future.successful(NotFound)
}
}
}
是否可以使用 for comprehension 来编写此函数?我有一个嵌套的 flatMap+map 调用,所以它看起来应该是可能的。
是的,这是可能的。像这样:
def viewList(id: Long) = AuthenticatedAction.async { implicit request =>
val userId = request.user.toLong
for {
list <- db.run(todoLists.filter(listById(id, userId)).result.headOption)
resp <- list.fold[Future[Result]](Future.successful(NotFound)) { _ =>
val json = toJson(list).as[JsObject]
// Fetch the items in this list and add them to the JSON response
db.run(todoItems.filter(_.listId === id).sortBy(_.text).result).map { items =>
Ok(json + ("items" -> toJson(items)))
}
}
} yield resp
}
另一种变体:
def viewList(id: Long) = AuthenticatedAction.async { implicit request =>
val userId = request.user.toLong
for {
list <- db.run(todoLists.filter(listById(id, userId)).result.headOption)
items <- db.run(todoItems.filter(_.listId === id).sortBy(_.text).result)
} yield list match {
case Some(_) => Ok(toJson(list).as[JsObject] + ("items" -> toJson(items)))
case None => NotFound
}
}
我是 Scala 的新手,我正在构建一个 Play 应用程序来学习 Scala 和 Slick。该应用程序有待办事项列表,每个列表都有项目。每个用户都有多个列表。我写了一个控制器来获取列表 JSON,并且 JSON 包括列表中的所有项目。
def viewList(id: Long) = AuthenticatedAction.async { implicit request =>
val userId = request.user.toLong;
db.run(todoLists.filter(listById(id, userId)).result.headOption).flatMap { list =>
list match {
case Some(_) => {
val json = toJson(list).as[JsObject]
// Fetch the items in this list and add them to the JSON response
db.run(todoItems.filter(_.listId === id).sortBy(_.text).result).map { items =>
Ok(json + ("items" -> toJson(items)))
}
}
case None => Future.successful(NotFound)
}
}
}
是否可以使用 for comprehension 来编写此函数?我有一个嵌套的 flatMap+map 调用,所以它看起来应该是可能的。
是的,这是可能的。像这样:
def viewList(id: Long) = AuthenticatedAction.async { implicit request =>
val userId = request.user.toLong
for {
list <- db.run(todoLists.filter(listById(id, userId)).result.headOption)
resp <- list.fold[Future[Result]](Future.successful(NotFound)) { _ =>
val json = toJson(list).as[JsObject]
// Fetch the items in this list and add them to the JSON response
db.run(todoItems.filter(_.listId === id).sortBy(_.text).result).map { items =>
Ok(json + ("items" -> toJson(items)))
}
}
} yield resp
}
另一种变体:
def viewList(id: Long) = AuthenticatedAction.async { implicit request =>
val userId = request.user.toLong
for {
list <- db.run(todoLists.filter(listById(id, userId)).result.headOption)
items <- db.run(todoItems.filter(_.listId === id).sortBy(_.text).result)
} yield list match {
case Some(_) => Ok(toJson(list).as[JsObject] + ("items" -> toJson(items)))
case None => NotFound
}
}