Jak mogę przedstawić relację wiele do wielu za pomocą tabeli linków z ScalaQuery lub SLICK?
Ostatnio zadałem podobne pytanie i dostałem świetną odpowiedź na rozwiązanie problemu wielu do wielu relacji z Lift Mapper. Przejrzałem dokumentację ScalaQuery/SLICK, ale nie dokumentuje ona podejścia do utrzymywania danych, w których zaangażowane są tabele linków. Jeśli ktoś wie, jak zrobić mapowanie wielu do wielu za pomocą Slicka, byłoby świetnie, gdybyś mógł się nim podzielić.
1 answers
Ten test (stworzony przez Stefana Zeigera) JEST NOWY W zestawie testów SLICK i całkiem ładnie odpowiada na pytanie:
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)
}
Aktualizacja:
Nie jestem do końca pewien, jaki byłby najlepszy sposób integracji logiki biznesowej i wytrwałości w Scali (ponieważ jest to coś więcej niż OO czy FP), więc zadałem nowe pytanie na ten temat . Mam nadzieję, że pomoże to komuś, kto jest również ciekawy tego problemu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:21