Как я могу представить отношения "многие ко многим", используя таблицу ссылок с ScalaQuery или SLICK? - программирование
Подтвердить что ты не робот

Как я могу представить отношения "многие ко многим", используя таблицу ссылок с ScalaQuery или SLICK?

Я недавно задал аналогичный вопрос и получил отличный ответ о решении проблемы взаимоотношений "многие ко многим" с помощью Lift Mapper. Я посмотрел документацию ScalaQuery/SLICK, но не документирует подход к сохраняющимся данным, в которых задействованы таблицы ссылок. Если кто-то знает, как сделать сопоставление "много-ко-многим", используя SLICK, было бы здорово, если вы можете поделиться им.

4b9b3361

Ответ 1

Этот тест (созданный Стефаном Зейгером) является новым в наборе тестов SLICK и отвечает на вопрос довольно хорошо:

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

Update:

Я не совсем уверен, что было бы лучшим способом интегрировать бизнес-логику и настойчивость в Scala (так как это больше, чем OO или FP), поэтому Я спросил новую вопрос об этом. Надеюсь, это поможет кому-то еще, кто также интересуется этой проблемой.