我有一个用户可以再使用一个LoginInfos。我希望通过id找到该用户,然后将每个关联的LoginInfos打包到User对象中。
我的期望是,我将获得的行数等于每个具有相同用户的LoginInfos的数量。因此,我首先将用户映射到对象,然后映射每个LoginInfos。有没有更好的办法?
以下是我所拥有的:
foreach
答案 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,我做了类似的事情。 不要把它视为理所当然,我没有你的表定义,但它应该工作..