使用Scala和Slick将多个映射到一个

时间:2016-07-19 13:00:27

标签: scala playframework-2.0 slick

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

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

以下是我所拥有的:

foreach

1 个答案:

答案 0 :(得分:0)

我会做这样的事情:

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,我做了类似的事情。 不要把它视为理所当然,我没有你的表定义,但它应该工作..