从连接查询重建对象树

Pau*_*ega 5 scala slick

让我们假设我有以下数据库模型(不是真实的情况,所以请原谅我这个例子的完全愚蠢):

在此输入图像描述

我想从db中获取连接结果,这样我就可以从Facultyelement 开始构造这些对象的树.

因此我会有以下案例类:

  case class StudentWithGrades(student: Student, grades: Seq[Grade])
  case class GroupWithStudents(group: Group, students: Seq[Student])
  case class FacultyWithGroups(faculty: Faculty, groups: Seq[Group])
Run Code Online (Sandbox Code Playgroud)

并且想要重建从db中检索到的行,以便我最终只需要一个Seq[FacultyWithGroups].

有没有比这更简单的方法:

  db.run (
    FacultyTable
      .join(GroupTable).on(_.id === _.facultyId)
      .join(StudentTable).on(_._2.id === _.groupId)
      .join(GradeTable).on(_._2.id === _.studentId)
      .result
      .map {
        _.groupBy { case (((faculty, group), student), _) =>
          (faculty, group, student)
        }
        .map { case ((faculty, group, student), groupped) =>
          (faculty, group, StudentWithGrades(student, groupped.map(_._2)))
        }
        .toSeq
        .groupBy { case (faculty, group, studentGrades) =>
          (faculty, group)
        }
        .map { case ((faculty, group), groupped) =>
          (faculty, GroupWithStudents(group, groupped.map(_._3)))
        }
        .toSeq
        .groupBy { case(faculty, group) =>
            faculty
        }
        .map { case(faculty, groupped) =>
          FacultyWithGroups(faculty, groupped.map(_.2))
        }
      }
  )
Run Code Online (Sandbox Code Playgroud)

虽然它实际上与Slick(以类似于经典ORMs 的方式重建对象树)相关,但在我看来,对于集合的巧妙处理而言,它本身更多地是一个问题Slick.