gpt4 book ai didi

scalaquery - 如何使用带有 ScalaQuery 或 SLICK 的链接表呈现多对多关系?

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

我问过 similar question recently, and got a great reply关于使用 Lift Mapper 解决多对多关系问题。我看了ScalaQuery/SLICK documentation但它没有记录在涉及链接表的情况下持久化数据的方法。如果有人知道如何使用 SLICK 进行多对多映射,如果您能分享它就太好了。

最佳答案

This test (由 Stefan Zeiger 创建)是 SLICK 测试套件中的新内容,并且很好地回答了这个问题:

def testManyToMany(): Unit = db withSession {

object A extends Table[(Int, String)]("a") {
def id = column[Int]("id", O.PrimaryKey)
def s = column[String]("s")
def * = id ~ s
def bs = AToB.filter(_.aId === id).flatMap(_.bFK)
}

object B extends Table[(Int, String)]("b") {
def id = column[Int]("id", O.PrimaryKey)
def s = column[String]("s")
def * = id ~ s
def as = AToB.filter(_.bId === id).flatMap(_.aFK)
}

object AToB extends Table[(Int, Int)]("a_to_b") {
def aId = column[Int]("a")
def bId = column[Int]("b")
def * = aId ~ bId
def aFK = foreignKey("a_fk", aId, A)(a => a.id)
def bFK = foreignKey("b_fk", bId, B)(b => b.id)
}

(A.ddl ++ B.ddl ++ AToB.ddl).create
A.insertAll(1 -> "a", 2 -> "b", 3 -> "c")
B.insertAll(1 -> "x", 2 -> "y", 3 -> "z")
AToB.insertAll(1 -> 1, 1 -> 2, 2 -> 2, 2 -> 3)

/*val q1 = for {
a <- A if a.id >= 2
aToB <- AToB if aToB.aId === a.id
b <- B if b.id === aToB.bId
} yield (a.s, b.s)*/

val q1 = for {
a <- A if a.id >= 2
b <- a.bs
} yield (a.s, b.s)

q1.foreach(x => println(" "+x))

assertEquals(Set(("b","y"), ("b","z")), q1.list.toSet)
}

更新:

我不太确定在 Scala 中集成业务逻辑和持久性的最佳方式是什么(因为这不仅仅是 OO 或 FP),所以 I asked a new question about this .希望这可以帮助其他也对这个问题感到好奇的人。

关于scalaquery - 如何使用带有 ScalaQuery 或 SLICK 的链接表呈现多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515852/

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