15

SLICK 1.0.0-RC2 を使用しています。次の 2 つのテーブル Directorate と ServiceArea を定義しました。ここで、Directorate は ServiceArea と 1 対多の関係にあります。

case class Directorate(dirCode: String, name: String)

object Directorates extends Table[Directorate]("DIRECTORATES") {

  def dirCode = column[String]("DIRECTORATE_CODE", O.PrimaryKey)

  def name = column[String]("NAME")

  def * = dirCode ~ name  <> (Directorate, Directorate.unapply _) 
}

case class ServiceArea(areaCode: String, dirCode: String, name: String)

object ServiceAreas extends Table[ServiceArea]("SERVICE_AREAS") {

  def areaCode = column[String]("AREAE_CODE", O.PrimaryKey)

  def dirCode = column[String]("DIRECTORATE_CODE")

  def name = column[String]("NAME")

  def directorate = foreignKey("DIR_FK", dirCode, Directorates)(_.dirCode)

  def * = areaCode ~ dirCode ~ name <> (ServiceArea, ServiceArea.unapply _)
}

Directorate ケース クラスを Play アプリケーション フォームで役立つようにするために、Directorate ケース クラスを再定義して、その Directorate に関連する ServiceAreas のSeqを持たせようとしています。

case class Directorate(dirCode: String, name: String, serviceAreas: Seq[ServiceArea])

私の問題は、Directorate テーブル プロジェクションにあります。Directorates でメソッドを作成しようとしました:

def serviceAreas = (for { a <- ServiceAreas
                         if (a.dirCode === dirCode)
                    } yield (a)).list map {
                      case t: ServiceArea => t
                    }

私は何かを試すことができるように

def * = dirCode ~ name  ~ serviceAreas <> (Directorate, Directorate.unapply _)

ただし、serviceAreas は一方向にしか移動しないため、これは機能しません。

Directorate ケース クラスが有用なドメイン オブジェクトであるためには、関連する ServiceAreas を含めることができる必要があるというのは、私には理にかなっているように思えます。

Directorate テーブル プロジェクションが機能するように、逆の関係をどのようにトラバースする必要があるのか​​ 疑問に思っています。

4

1 に答える 1

15

もっとエレガントな解決策があると確信していますが、これでうまくいくはずです:

import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession

object SlickExperiments2 {

  Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession {

    (Directorates.ddl ++ ServiceAreas.ddl).create

    case class Directorate(dirCode: String, name: String) {
      def serviceAreas: Seq[ServiceArea] = (for {
        a <- ServiceAreas
        if (a.dirCode === dirCode)
      } yield (a)).list
    }

    object Directorates extends Table[Directorate]("DIRECTORATES") {

      def dirCode = column[String]("DIRECTORATE_CODE", O.PrimaryKey)

      def name = column[String]("NAME")

      def * = dirCode ~ name <> (Directorate, Directorate.unapply _)
    }

    case class ServiceArea(areaCode: String, dirCode: String, name: String)

    object ServiceAreas extends Table[ServiceArea]("SERVICE_AREAS") {

      def areaCode = column[String]("AREAE_CODE", O.PrimaryKey)

      def dirCode = column[String]("DIRECTORATE_CODE")

      def name = column[String]("NAME")

      def directorate = foreignKey("DIR_FK", dirCode, Directorates)(_.dirCode)

      def * = areaCode ~ dirCode ~ name <> (ServiceArea, ServiceArea.unapply _)
    }

    Directorates.insert(Directorate("Dircode", "Dirname"))

    ServiceAreas.insertAll(ServiceArea("a", "Dircode", "A"), ServiceArea("b", "Dircode", "B"))

    val sa = (for{
    d <- Directorates
    } yield d).list map { case t: Directorate => t.serviceAreas}

    println(sa)
  }                                              
 //> List(List(ServiceArea(a,Dircode,A), ServiceArea(b,Dircode,B)))
}
于 2013-02-05T12:22:42.157 に答える