gpt4 book ai didi

scala - SLICK 如何定义双向一对多关系以用于案例类

转载 作者:行者123 更新时间:2023-12-03 20:42:26 25 4
gpt4 key购买 nike

我正在使用 SLICK 1.0.0-RC2。我定义了以下两个表 Directorate 和 ServiceArea,其中 Directorate 与 ServiceArea 是一对多的关系

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 序列。
case class Directorate(dirCode: String, name: String, serviceAreas: Seq[ServiceArea])

我的问题现在是 Directorate 表投影。我试图在董事会中创建一个方法:
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 只有一种方式。

对我来说,董事会案例类是一个有用的域对象,它应该能够包含相关的 ServiceAreas,这似乎是合理的。

我想知道我应该如何遍历逆关系,以便 Directorate 表投影可以工作。

最佳答案

我确信有一个更优雅的解决方案,但这应该可以解决问题:

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)))
}

关于scala - SLICK 如何定义双向一对多关系以用于案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14705194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com