如何使用 Slick 对结果进行分组

How to group results with Slick

假设我有这两个模型:

case class Department(id: Long, title: String)
case class Program(id: Long, departmentId: Long, title: String)

和两个 TableQuerydepartmentsprograms,基于 Table 分别映射到那些案例 类。

我想查询返回一个 Seq[(Department, Seq[Program])],其中我有一个部门列表及其相应的程序。

我是这样开始的:

val query = 
  (departments join programs on ((d, p) => d.id === p.departmentId))
    .groupBy {...}

但是我放在 group by 子句中的任何内容都没有意义。

请帮忙。

这个怎么样?

val query = departments.join(programs).on(_.id === _.departmentId)
        .result
        .map(_.groupBy(_._1.id))

db.run(query)

@osehyum,感谢您的回答。您的查询返回此:

Map[Long, Seq[(Department, Program)]]

这里的Long是部门编号

我用这个成功地改变了它:

val query = departments.joinLeft(programs).on(_.id === _.departmentId).result
    .map(_.groupBy(_._1).toSeq)
    .map(items => items.map { case (dep, rows) =>
      (dep, rows.map(_._2).filter(_.isDefined).map(_.get))
    })

注意我这次用的是joinLeft,所以Program变成了Option[Program],只好filtermap。已测试。