2012-07-17 6 views
16

मैंने लिफ्ट मैपर के साथ कई से अधिक रिश्ते की समस्या को हल करने के लिए similar question recently, and got a great reply से पूछा है। मैंने ScalaQuery/SLICK documentation पर देखा लेकिन यह डेटा को बनाए रखने के लिए एक दृष्टिकोण दस्तावेज नहीं करता है जहां लिंक टेबल शामिल हैं। अगर कोई जानता है कि स्लिम का उपयोग करके कई से अधिक मैपिंग कैसे करें, तो यह बहुत अच्छा होगा अगर आप इसे साझा कर सकें।मैं ScalaQuery या Slick के साथ एक लिंक तालिका का उपयोग कर कई से अधिक रिश्ते कैसे पेश कर सकता हूं?

उत्तर

23

This test (स्टीफन Zeiger द्वारा बनाई गई) चालाक टेस्ट स्वीट में नया है, और काफी अच्छी तरह से सवाल का जवाब:

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

अद्यतन:

मैं काफी कुछ सबसे अच्छा होगा क्या नहीं कर रहा हूँ रास्ता स्कैला में व्यापार तर्क और दृढ़ता को एकीकृत करता है (क्योंकि यह ओओ या एफपी से अधिक है), इसलिए I asked a new question about this। उम्मीद है कि यह किसी और की मदद करता है जो इस समस्या के बारे में भी उत्सुक है।

संबंधित मुद्दे

 संबंधित मुद्दे