2016-07-19 7 views
0

もう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) 
} 
} 
+0

「slickUsers」をフィルタリングしてから、「slickUserLoginInfos」と「slickLoginInfos」に参加してみませんか?これらのフィルタがどのようなクエリを返すかわからない。 –

+0

問題を単純化するためにいくつかの変更を加えた。 – Chris

答えて

0

私はこのような何かをするだろう。 テーブル定義はありませんが、それはうまくいくはずです。

+0

フィルターをifに置き換えるのはなぜですか? – Chris

+0

たぶん、この単純なケースでは、あなたのクエリが正常に動作しますが、それはあなたが何をすべきかではありません[スリックに参加](http://slick.lightbend.com/doc/3.1.1/queries.html#joining-and-ジッパー)。 –