Как сопоставить результаты Slick с другой структурой данных?
Я только начал использовать Slick, и я сделал простой привет проект с постами и комментариями.
Я хотел бы иметь следующую структуру данных:
Seq[(Post, Option[Seq[Comment]])]
Тогда я мог бы перебрать комментарии так:
@for(p <- posts) {
@for(c <- posts.comments) {
@comment.title
}
}
Это мой запрос:
def allWithComments = {
val q = for {
(p, c) <- Posts join Comments on (_.id === _.postsId)
} yield (p,c) // do here something fancy and map the result
db.run(q.result)
}
Запрос возвращает следующую структуру прямо сейчас:
Seq[(models.Post, models.Comment)]
2 ответа
От Seq[(models.Post, models.Comment)]
в Seq[(Post, Option[Seq[Comment]])]
Вы можете использовать следующее:
(qResult groupBy (_._1) map { case (k,v) => (k, Option((v map (_._2)).toSeq)) }).toSeq
Я думаю, что переменная s ниже представляет структуру вашего запроса "Посты присоединяются к комментариям по (_.id === _.postsId)". Чтобы получить все комментарии к сообщению, вы можете выполнить операцию на следующей строке.
val s = List((1,"sam"),(2,"s"),(1,"a"),(3,"sadk"))
s.groupBy(_._1).map({case (p,c) => (p,c.map(_._2))}).toSeq //ArrayBuffer((2,List(s)), (1,List(sam, a)), (3,List(sadk)))