2012-07-17 11 views
16

He pedido similar question recently, and got a great reply para resolver un problema de relación de muchos a muchos con Lift Mapper. Miré el ScalaQuery/SLICK documentation pero no documenta un enfoque de datos persistentes donde están involucradas las tablas de enlaces. Si alguien sabe cómo hacer un mapeo de muchos a muchos usando SLICK, sería genial si puede compartirlo.¿Cómo puedo presentar una relación de muchos a muchos utilizando una tabla de enlaces con ScalaQuery o SLICK?

Respuesta

23

This test (creado por Stefan Zeiger) es nueva en el conjunto de pruebas pulido, y responde a la pregunta bastante bien:

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

Actualización:

No estoy muy seguro de lo que sería la mejor manera de integrar la lógica empresarial y la persistencia en Scala (ya que esto es más que OO o FP), por lo que I asked a new question about this. Espero que esto ayude a alguien más que también tenga curiosidad sobre este problema.

Cuestiones relacionadas