在 Scala Play 框架中映射 OneToMany 不向第二个表插入数据

Posted

技术标签:

【中文标题】在 Scala Play 框架中映射 OneToMany 不向第二个表插入数据【英文标题】:Mapping OneToMany in Scala Play framework not inserting data to the second table 【发布时间】:2015-09-11 08:17:03 【问题描述】:

问题是 - 我应该如何从这种输入中获取数据并将其正确传递给 DB(通过 SORM 框架)?

我尝试将数据传递到我的数据库中的两个表,我的工作结果是,虽然值已正确插入到第一个表(作者),但第二个表(书)保持不变。 可能我的问题是我没有正确命名页面上的嵌套重复输入,但我找不到正确的方法来做到这一点(我对 Scala 还很陌生,所以我可能缺乏这方面的经验)。

Ok(Json.toJson(author)) 

在 Application.scala 中的 addData 中向我展示了

"name":"what","books":[]

所以我认为,问题在于从请求中绑定数据。

我尝试在此处遵循示例:How to model an entity with many children in Sorm? 和此处:https://www.playframework.com/documentation/2.1.1/ScalaForms,通过对 Play 框架中的模板“play-scala”进行操作,所以我有这样的代码:

型号是:

case class Author(name: String, books: Seq[Book]) 

object Author 
implicit val authorFormat = Json.format[Author]


case class Book(title: String ) 

object Book 
implicit val bookFormat = Json.format[Book]


case class AuthorBook(name: Author, title: Book) 

scala.index.html

<table>
    <tr>
        <td>
        On the left Author, on the right Book
        <td>
    </tr>
    <tr>
    <td>
        <ul id="authors"></ul>
    </td>
    <td>
        <ul id="books"></ul>
    </td>
    </tr>
</table>

<table>
    <form action="@routes.Application.addData()" method ="post">
        <tr>
            <td>Author: <input name="author" type="text">
        </td>       
            <td>Books: <input name="books.title[0]" type="text"><br><input name="books.title[1]" type="text">
        </td>
        </tr>
        <tr>
            <td> 
                <button>Submit</button>
            </td>
        </tr>
    </form>
</table>

和 Application.scala

class Application extends Controller 
def index = Action 
Ok(views.html.index("E-Library"))


  val authorForm: Form[Author] = Form 
    mapping(
      "author" -> text,
      "books" -> seq(
          mapping(
          "title" -> text)(Book.apply)(Book.unapply)
      )
   )(Author.apply)(Author.unapply)
   

  def error = Action 
    Ok("error")
  

  def addData = Action  implicit request =>
      authorForm.bindFromRequest.fold(
    formWithErrors => 
      BadRequest("Bad request!")
    ,
    authorF => 
      val author = DB.save(authorF)
      Ok(Json.toJson(author))
      //Redirect(routes.Application.index())
    
  )
  

  def getAuthor = Action 
    val dataAuthor = DB.query[Author].fetch
    Ok(Json.toJson(dataAuthor))
  

  def getBook = Action 
    val dataBook = DB.query[Book].fetch
    Ok(Json.toJson(dataBook))
 

  def getData = Action 
    Redirect(routes.Application.index())
  

【问题讨论】:

【参考方案1】:

找到了! 如此处所述:Nested form in Play! Scala 2.2

我需要将表单中的输入名称从 book.title[0]book[0].title.

【讨论】:

以上是关于在 Scala Play 框架中映射 OneToMany 不向第二个表插入数据的主要内容,如果未能解决你的问题,请参考以下文章

配置映射中的 scala 类名

Scala Play:如何使用重复值和嵌套值呈现表单映射?

如何在视图页面中使用Play框架和Scala显示图像

如何搭建scala的play框架

Scala play框架中@Singleton的使用

访问控制、Scala 中的权利、Play 框架