【问题标题】:Mapping many to one with Scala and Slick使用 Scala 和 Slick 将多对一映射
【发布时间】:2016-11-22 09:33:25
【问题描述】:

我有一个用户可以再拥有一个 LoginInfos。我希望通过 id 找到这个用户,然后将每个关联的 LoginInfos 打包到 User 对象中。

我的期望是,我将获得与每个具有相同用户的 LoginInfo 的数量相等的行数。因此,我首先将用户映射到对象,然后再映射到每个 LoginInfos。有没有更好的办法?

这是我所拥有的:

def find(userID: UUID) = {
val query = for {
  dbUser <- slickUsers.filter(_.id === userID.toString)
  dbUserLoginInfo <- slickUserLoginInfos.filter(_.userID === dbUser.id)
  dbLoginInfo <- slickLoginInfos.filter(_.id === dbUserLoginInfo.loginInfoId)
} yield (dbUser, dbLoginInfo)
db.run(query.result).map { results =>
      var loginList = List[LoginInfo]()
results.foreach {
  case (user, loginInfo) =>
    loginList = LoginInfo(loginInfo.providerID, loginInfo.providerKey) :: loginList
}
results.headOption.map {
  case (user, loginInfo) =>
    User(
      UUID.fromString(user.userID),
      loginList,
      user.firstName,
      user.lastName,
      user.fullName,
      user.email,
      user.avatarURL)
}
}

【问题讨论】:

  • 为什么不过滤slickUsers,然后加入slickUserLoginInfosslickLoginInfos?我不确定所有这些过滤器会返回什么查询..
  • 我做了一些更改以简化问题。

标签: scala playframework-2.0 slick


【解决方案1】:

我会这样做:

def find(userID: UUID) = {

  val query = for {
    dbUser <- slickUsers.filter(_.id === userID.toString)
    dbUserLoginInfo <- slickUserLoginInfos if(_.userID === dbUser.id) // join would also work
    dbLoginInfo <- slickLoginInfos if(_.id === dbUserLoginInfo.loginInfoId)
  } yield (dbUser, dbLoginInfo)

  db.run(query.result).map { results =>
    val grouped = results.groupBy(_._1) // group by user, but it will be max 1, so it's ok..
    grouped.map {
      case (user, group) =>
        val loginInfo = group.map{ case (dbUser, dbLoginInfo) => LoginInfo(dbLoginInfo.providerID, dbLoginInfo.providerKey) }
        User(
          UUID.fromString(user.userID),
          loginInfo,
          user.firstName,
          user.lastName,
          user.fullName,
          user.email,
          user.avatarURL)
    }.headOption
  }
}

看看我的blog post,我也做过类似的事情。 不要想当然,我没有你的表定义,但它应该可以工作..

【讨论】:

  • 为什么要用 if 代替 filter?
  • 也许在这种简单的情况下,您的查询会正常工作,但您不应该这样做join in Slick
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多