Ho chiesto a similar question recently, and got a great reply di risolvere un problema di relazione molti-a-molti con Lift Mapper. Ho esaminato lo ScalaQuery/SLICK documentation ma non documenta un approccio ai dati persistenti in cui sono coinvolte le tabelle di collegamento. Se qualcuno sa come eseguire la mappatura molti-a-molti usando SLICK, sarebbe bello poterlo condividere.Come posso presentare una relazione molti-a-molti utilizzando una tabella di collegamento con ScalaQuery o SLICK?
16
A
risposta
23
This test (creato da Stefan Zeiger) è nuovo nella suite di test slick, e risponde alla domanda abbastanza bene:
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)
}
Aggiornamento:
Io non sono assolutamente certo che cosa sarebbe il migliore integrare la logica di business e la persistenza in Scala (poiché questo è più di OO o FP), quindi I asked a new question about this. Spero che questo aiuti qualcun altro che è anche curioso di questo problema.
Problemi correlati
- 1. Tutorial Play framework + SLICK (Scalaquery)
- 2. Come eseguire una query a pagina utilizzando ScalaQuery?
- 3. Elenco di tutte le tabelle con una relazione con una data tabella o vista
- 4. Come posso creare una tabella utilizzando ASCII in una console?
- 5. Query tabella ad albero ricorsivo con Slick
- 6. Scala Slick/ScalaQuery BigDecimal crea decimali (10,0) come consentire i decimali?
- 7. Come posso partizionare una tabella con HIVE?
- 8. righe contare con Slick 1.0.0
- 9. Come gestire una relazione "OR" in un progetto ERD (tabella)?
- 10. Collegamento di una libreria condivisa utilizzando gcc
- 11. Usando Unix/Bash, come posso creare una tabella di ricerca?
- 12. Sottotipo per un elemento tabella in una Scala Slick Query
- 13. Impossibile aggiungere una relazione nidificato o di una colonna elemento a una tabella che contiene una colonna simpleContent
- 14. Come modellare una relazione simmetrica con django?
- 15. Rails: ordinare utilizzando una relazione has_many/belongs_to
- 16. Presentare una vista modale utilizzando l'animazione fade-in
- 17. Relazione sulla stessa tabella con Entity Framework
- 18. Come posso recuperare attributi specifici di una relazione/collezione?
- 19. Verifica esistenza tabella in slick 3.0
- 20. Come fare clic su una riga della tabella di collegamento utilizzando ember.js?
- 21. Come si crea una relazione DBIx :: Class con una condizione di join fisso?
- 22. Come posso impostare una ricerca di facet con una relazione molti a molti usando Sunspot?
- 23. Hibernate: relazione padre/figlio in una tabella singola
- 24. Come posso inserire dati in una tabella SQL utilizzando C# e implementare una funzione di caricamento?
- 25. Django Rest Framework, collegamento ipertestuale a una relazione nidificata
- 26. Posso usare Elenco Scala con Slick (Riproduci)?
- 27. Come presentare una raccolta ricorsiva in JSP
- 28. Creazione di una tabella utilizzando l'API Win32
- 29. Utilizzando una variabile di tabella all'interno di una esiste dichiarazione
- 30. Come posso dare un nome di collegamento a una riga della tabella HTML?