如何使用 scala 编写包含引用列的 table 的插入查询到另一个 table 的 play-slick?

how to write insert query for table that contains reference column to another table in play-slick with scala?

我正在使用 slick 3.1、Play framework 2.5 和 scala 2.11。我的应用程序有 'User' table 和引用列 'addressId',它引用 'Address' table 的 'id' 列。我无法在这两个 table 中插入数据。这是此代码

这是用户表单:

val registerForm: Form[RegisterForm] = Form {
mapping(
  "id" -> optional(number),
  "firstname" -> nonEmptyText.verifying("letters only", name => name.isEmpty || name.matches("[A-z\s]+")),
  "lastname" -> nonEmptyText.verifying("letters only", name => name.isEmpty || name.matches("[A-z\s]+")),
  "email" -> text.verifying(nonEmpty),
  "password" -> text.verifying(nonEmpty),
  "address" -> mapping(
      "id" -> optional(number),
      "city" -> nonEmptyText.verifying("letters only", name => name.isEmpty || name.matches("[A-z\s]+")),
      "state" -> text,
      "country" -> text,
      "pin" -> number
      )(AddressForm.apply)(AddressForm.unapply)
  )(RegisterForm.apply)(RegisterForm.unapply)
 }

这是两个型号类:

case class Address(id: Option[Int], city: String, state: String, country: String, pin: Int)
case class User(id: Option[Int], firstname: String, lastname: String, email: String, password: String, addressId: Option[Int])

这两个 类 映射到相应的数据库 tables 与 tables 查询:

private class UserDB(tag: Tag) extends Table[User](tag, "user") {

def id = column[Option[Int]]("id", O.PrimaryKey, O.AutoInc)

def firstname = column[String]("firstname")

def lastname = column[String]("lastname")

def email = column[String]("email")

def password = column[String]("password")

def addressId = column[Option[Int]]("address_id")

override def * = (id, firstname, lastname, email, password, addressId) <> ((User.apply _).tupled, User.unapply)

def address_fk= foreignKey("fk_user_address", addressId, addressTable)(_.id)

 }

private class AddressDB(tag: Tag) extends Table[Address](tag, "address") {

def id = column[Option[Int]]("id", O.PrimaryKey, O.AutoInc)

def city = column[String]("city")

def state = column[String]("state")

def country = column[String]("country")

def pin = column[Int]("pin")

override def * = (id, city, state, country, pin) <> ((Address.apply _).tupled, Address.unapply)

}


private val userTable = TableQuery[UserDB]

private val addressTable = TableQuery[AddressDB]

请告诉我如何使用 slick 通过一个查询将数据插入到两个相关的 table 中。

非常感谢您。

您应该在单个事务中使用 id 返回地址插入和用户表插入,示例:

val query = for {
  adressId <- addressTable returning addressTable.map(_.id) += Address(....)
  userTable += User(..., Some(adressId), ....)
} yield ()

db.run(query.transactionally)

编辑:上面的查询不返回任何内容,如果您需要创建用户,请使用:

val query = for {
  adressId <- addressTable returning addressTable.map(_.id) += Address(....)
  user <- userTable returning userTable += User(..., Some(adressId), ....)
} yield user

db.run(query.transactionally)