2017-07-29 11 views
1

私は、私のジョインをマッピングするためにクエリ側で型を定義しようとしています。これは、私のプロジェクションケースクラスのポストクエリに手動で適用する必要がある値のタプルを返さないようにするためです。私のようなケースクラスに投影するSlickの型付き投影

case class Parent(id: Int, name: String, extra: String) 

class ParentTable(tag: Tag) extends Table[Parent](tag, "parent") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("name") 
    def extra = column[String]("extra") 
    def * = (id, name, extra) <> (Parent.tupled, Parent.unapply) 
} 

val parents = TableQuery[ParentTable] 

case class Child(id: Int, parentId: Int, name: String, extra: String) 

class ChildTable(tag: Tag) extends Table[Child](tag, "child") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def parentId = column[Int]("parent_id") 
    def parent = foreignKey("parent_fk", parentId, parents)(_.id) 
    def name = column[String]("name") 
    def extra = column[String]("extra") 
    def * = (id, parentId, name, extra) <> (Child.tupled, Child.unapply) 
} 
val children = TableQuery[ChildTable] 

case class ChildWithParentName(id: Int, name: String, parentName: String) 

参加し、投影は次のようになります。私はこれを入れて

val q = for { 
    c <- children 
    p <- parents if c.parentId === p.id 
} yield (c.id,c.name,p.name) 

のような関係を考えると

関数内で、childrenparentsをパラメータ化することができます。時々私は.resultをしたいので、この関数は、クエリを実行しないと、私の関数のシグネチャがあるので、時々私は、.result.headOptionをしたい:

Query[(Rep[Int], Rep[String], Rep[String]), (Int, String, String), Seq] 

私のような形状の何かをクエリ側のタイプを作成したいと思います:

class ChildParentProjection(val id: Rep[Int], 
          val name: Rep[String], 
          val parentName[String]) 

私は次のように関数のシグネチャを取得することができるように:

Query[ChildParentProjection, ChildWithParentName, Seq] 

はツルツルにその可能ですか?

答えて

1

クラスChildParentProjectionを使用したい理由がわかりません。 クエリにresultを実行する際にSeq[ChildWithParentName]を返したい場合、あなたはあなたのモナドの結果タプルが、このようなChildWithParentNameクラスに参加マッピングする必要があります:

val q = for { 
c <- children 
p <- parents if c.parentId === p.id 
} yield (c.id,c.name,p.name) <> (ChildWithParentName.tupled,ChildWithParentName.unapply) 

私は私はあなたの質問を理解していたい

+0

ありがとうございます。私は '<>'がクエリレベルで適用できることに気づいていませんでした。結果として得られる 'MappedProjection'は、私が達成したいと思っていたもの、つまり' ChildParentProjection'を必要としないと思っていたものよりもはるかに単純なものでした。しかしもう1つの質問: 'q'が' sortBy'で簡単に使えるようになる前に、タプルか 'MappedProjection'から' ChildWithParentName'のどちらかを抽出できないようです –