もう1つLoginInfosを持つことができるユーザーがいます。このユーザーをidで見つけて、関連するLoginInfoをそれぞれUserオブジェクトにパックしたいと思います。ScalaとSlickを使って多対1にマッピングする
私は、同じユーザーを持つLoginInfosの数に等しい数の行を返すことを期待しています。したがって、私は最初にユーザーをオブジェクトにマッピングし、次にLoginInfoをマッピングします。より良い方法がありますか?
は、ここで私が持っているものです。
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、私がやった何か:
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」をフィルタリングしてから、「slickUserLoginInfos」と「slickLoginInfos」に参加してみませんか?これらのフィルタがどのようなクエリを返すかわからない。 –
問題を単純化するためにいくつかの変更を加えた。 – Chris