2016-10-25 7 views
0

私はSlick 3.1.0で次のようにモデル化しようとしています。私がどのように見えるFullReviewというクラスを、移入する必要がありSlick one to many and grouping

case class Review(txt: String, userId: Long, id: Long) 
case class User(name: String, id: Long) 
case class ReviewEvent(event: String, reviewId: Long) 

そうのように、私はで参加して、グループの組み合わせを使用して FullReviewを取得しようとしている、私はモデルのそれぞれのための右のテーブルを持っていると仮定すると
case class FullReview(r: Review, user: User, evts: Seq[ReviewEvent]) 

val withUser = for { 
    (r, u) <- RTable join UTable on (_.userId === _.id) 
} 

val withUAndEvts = (for { 
    ((r, user), evts) <- withUser joinLeft ETable on { 
    case ((r, _), ev) => r.id === ev.reviewId 
    } 
} yield (r, user, events)).groupBy(_._1._id) 

これは得ているようです、入れ子になったときQueryタイプ、私が見ることができます。私はここで間違って何をしていますか?

+0

エラーとは何ですか? – pamu

+0

@pamuそれ自体エラーはありません。これを 'db.run'ブロックの中でどのように消費しますか?さて、 'user_id'でレビューのリストをデータベースに照会する' Seq [FullReview] 'を取得したいのですか? – Ashesh

+1

[this](http://olivebh.com/scala-play-slick.html)素晴らしいブログ記事をご覧ください。 –

答えて

0

いくつかのことから、私はクライアント上で集約を行うほうがよいと考えました。間接的には、テーブルETableの100行がRTableの1行に一致すると、クライアント上に複数の行が表示されるということです。クライアントはReviewEventをすべてグループ化するために独自の集約を実装する必要があります。Review

ページネゴシエーションに関しては、次のようなことがあります。

def withUser(page: Int, pageSize: Int) = for { 
    (r, u) <- RTable.drop(page * pageSize).take(pageSize) join UTable on (_.userId === _.id) 
} 

これは今のところ十分にエレガントだと思います。誰かがより良い答えを持っていれば、それを聞いてうれしいです。

1

私が正しくあなたを理解していれば、あなたは次の例を使用することができますが:あなたはこの要求に改ページを追加したい場合は

val users = TableQuery[Users] 
val reviews = TableQuery[Reviews] 
val events = TableQuery[ReviewEvents] 

override def findAllReviews(): Future[Seq[FullReview]] = { 
    val query = reviews 
    .join(users).on(_.userId === _.id) 
    .joinLeft(events).on(_._1.id === _.reviewId) 

    db.run(query.result).map { a => 
    a.groupBy(_._1._1.id).map { case (_, tuples) => 
     val ((review, user), _) = tuples.head 
     val reviewEvents = tuples.flatMap(_._2) 
     FullReview(review, user, reviewEvents) 
    }.toSeq 
    } 
} 

、私はすでにhereに答えてきたとhereは完全な例です。

+0

あなたの答えをありがとう。それはまさに私がやってきたもので、私の答えも示唆しているものです。グループ化はクライアント上で実行する必要があります。このアプローチの問題は、1000のイベントを持つレビューのために1000行を取得することになります。それが私が避けたかったのです。誰かがそのような状況のためにパフォーマンスメトリクスを実行しているかどうかを確認したいと思います。 – Ashesh