【问题标题】:Play Scala Anorm One to Many relationship玩 Scala Anorm 一对多关系
【发布时间】:2013-07-26 12:47:41
【问题描述】:

来自play anorm, create a model from json without passing anorm PK value in the json 我正在尝试将 Seq[Address] 添加到案例类中

case class User(
  id: Pk[Long] = NotAssigned,
  name: String = "",
  email: String = "",
  addresses: Seq[Address])

Address 是一个包含三个字符串的简单对象/类。一个用户可以有多个地址,如何在 findAll 中获取所有地址以及用户。

  def findAll(): Seq[User] = {
    Logger.info("select * from pt_users")
    DB.withConnection { implicit connection =>
      SQL(
        """
          select * from pt_users where name like {query} limit {size} offset {offset}   
        """).as(User.list *)
    }
  }

【问题讨论】:

    标签: mysql scala playframework playframework-2.0 anorm


    【解决方案1】:

    关于我发现有用的东西的旁注:如果您不确定是否总是想要获取用户的地址,您可以避免将该关系添加为字段,而是使用元组或其他数据结构来表示他们。这将允许您拥有这样的方法:

    def allUsersWithAddresses(): Map[User, Seq[Address])] = ...
    

    但仍有一些方法只返回用户而没有加入的数据。

    要读取连接(或子选择),您必须使用解析器解析组合输出,如下所示:

    .as(User ~ Address *).groupBy(_._1)
    

    如果您真的想将地址放在用户内部,则必须从用户解析器中将地址列表设为空,然后将每个不同的用户映射到具有地址的用户中:

    .as(User ~ Address *).groupBy(_._1).map { 
      case (user, addresses) => user.copy(addresses = addresses)
    }
    

    请注意,这些示例只是指向近似解决方案的指针,而不是复制粘贴和编译就绪的代码。

    希望对您有所帮助!

    【讨论】:

    • 感谢您的及时回复。我是初学者会按照你的建议尝试。同时我发现了这个 - stackoverflow.com/questions/15427469/… 并且它有效。将按照您建议的方式进行更新。
    【解决方案2】:

    这会起作用

    /** Parses a `Blog` paired with an optional `Post` that can be later be collapsed into one object. */
    val parser: RowParser[(Blog, Option[Post])] = {
        simple ~ Post.parser.? map {
            case blog~post => (blog, post)
        }
    }
    
    
    def list: List[Blog] = {
        DB.withConnection { implicit c =>
            SQL("""
                SELECT * FROM blogs b
                LEFT OUTER JOIN posts p ON(p.blog_id = b.id)
            """).as(parser *)
                .groupBy(_._1)
                .mapValues(_.map(_._2).flatten)
                .toList
                .map{ case (blog, posts) => blog.copy(posts = posts) }
        }
    }
    

    复制自https://index.scala-lang.org/mhzajac/anorm-relational/anorm-relational/0.3.0?target=_2.12

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多