Anorm (Scala) Как вернуть Json с объединенного стола? - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь связать 2 таблицы вместе и вернуть json из нее, к сожалению, документация и онлайн не очень ясно об этом, поэтому, если вы знаете, как решить эту проблему, пожалуйста, предоставьте фрагмент, из которого я узнаю.

У меня возникают трудности при рендеринге def All: List[(Country, City)]{....} параметров в вызове json, приведенном ниже:

Вот как я хотел бы вернуть json:

Ok(Json.obj("success" -> true, "CountryAndCities" -> CountryAndCities.All)

All:

package models

import play.api.db._
import play.api.Play.current

import anorm._
import anorm.SqlParser._

case class Country(id: Option[Int] = None, name: String)
case class City(id: Option[Int] = None, countryId: Int, name: String, population: Int)

object Country {

  val simple: RowParser[Country] = {
    get[Option[Int]]("country.id") ~
    str("country.name") map {
      case id~name => Country(id, name)
    }
  }
}

object City {

  def All: List[(Country, City)] = {

    DB.withConnection { implicit connection =>

      SQL(
        """
          SELECT *
          FROM city
            INNER JOIN country ON city.country_id = country.id
        """
      ).as(City.withCountry *)
    }
  }
}

1 Ответ

0 голосов
/ 02 апреля 2020

Итак, в вашем коде отсутствует часть разбора списка, я добавлю ее для полноты:

object City {
  def All: List[(Country, City)] = {

    DB.withConnection { implicit connection =>
      SQL(
        """
        SELECT *
        FROM city
        INNER JOIN country ON city.country_id = country.id
      """
      ).as(City.withCountry.*)
    }
  }

  def simple: RowParser[City] =
    int("city.id").? ~ int("city.countryId") ~
      str("city.name") ~ int("city.population") map {
      case id ~ countryId ~ name ~ population => City(id, countryId, name, population)
    }

  def withCountry: RowParser[(Country, City)] = simple ~ Country.simple map {
    case city ~ country => country -> city
  }
}

сейчас, если вы хотите отобразить его как JSON, простым способом было бы набрать:

implicit val userFormat = Json.format[Country]
implicit val cityFormat = Json.format[City]

Ok(Json.arr(City.All))
...