play-slick scala 多对多

play-slick scala many to many

我有一个端点可以说 /order/ 我可以发送 json 对象(我的订单),其中包含一些产品等,所以我的问题是我必须先保存订单并等待从数据库返回订单 ID,然后用这个新订单 ID 保存我的产品(我们正在谈论多对多关系,这就是为什么还有另一个 table)

考虑这个控制器方法

def postOrder = Action(parse.json[OrderRest]) { req => {

    Created(Json.toJson(manageOrderService.insertOrder(req.body)))
  }
}

这就是我的回购方法的样子

  def addOrder(order: Order) = db.run {
    (orders returning orders) += order
  }

我如何链接 db.runs 以首先插入订单,获取订单 ID,然后使用我刚刚获得的订单 ID 插入我的产品?

我正在考虑在我的控制器和存储库之间放置一些服务,并在那里管理这些操作,但我不知道从哪里开始

您可以使用 for 链接数据库操作。下面是通过添加 header 行来表示 table 然后添加数据行来将 table 添加到数据库的示例。在这种情况下,它是一个简单的 table 包含 (age, value).

/** Add a new table to the database */
def addTable(name: String, table: Seq[(Int, Int)]) = {
  val action = for {
    key <- (Headers returning Headers.map(_.tableId)) += HeadersRow(0, name)
    _ <- Values ++= table.map { case (age, value) => ValuesRow(key, age, value) }
  } yield key

  db.run(action.transactionally)
}

这是从工作代码中删减的,但它应该给出如何做你想做的事情的想法。第一个 for 语句将生成订单 ID,然后第二个语句将添加具有该订单 ID 的订单。

这样做 transactionally 除非订单数据有效(在数据库方面),否则不会创建新订单。