Как сопоставить результаты 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)))
Другие вопросы по тегам