2012-07-17 18 views
16

Lift Mapper ile çoktan çoğa ilişki sorununu çözme konusunda bir similar question recently, and got a great reply sordum. ScalaQuery/SLICK documentation'a baktım ama bağlantı tablolarının yer aldığı kalıcı veri yaklaşımını belgelemiyor. Birisi SLICK kullanarak çoktan çoğa haritalamanın nasıl yapılacağını bilirse, paylaşabilmeniz harika olur.ScalaQuery veya SLICK ile bir bağlantı tablosunu kullanarak çoktan çoğa ilişkiyi nasıl sunabilirim?

cevap

23

This test (Stefan Zeiger tarafından oluşturulan) SLICK test paketi yenidir ve oldukça güzel soruya cevap verir:

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

Güncelleme:

Ben en iyi ne olacağını oldukça emin değilim Scala'da iş mantığını ve kalıcılığını entegre etmenin yolu (bu, OO veya FP'den daha fazlasıdır), yani I asked a new question about this. Umarım bu problemi merak eden başka birine yardım eder.

İlgili konular