使用可选列更新Scala Slick行

使用可选列更新Scala Slick行,scala,playframework,slick,slick-3.0,Scala,Playframework,Slick,Slick 3.0,我有一个包含多列的光滑表,我想根据用户输入更新其中的一些列。我的桌子看起来像这样: class Users(_tableTag: Tag) extends Table[User](_tableTag, "users") { def * = (id, name, email, phone, passwordHash, createdAt) <> (User.tupled, User.unapply) val id: Rep[Long] = column[Long]("id",

我有一个包含多列的光滑表,我想根据用户输入更新其中的一些列。我的桌子看起来像这样:

class Users(_tableTag: Tag) extends Table[User](_tableTag, "users") {
  def * = (id, name, email, phone, passwordHash, createdAt) <> (User.tupled, User.unapply)

  val id: Rep[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
  val name: Rep[String] = column[String]("name")
  val email: Rep[String] = column[String]("email")
  val phone: Rep[String] = column[String]("phone")
  val passwordHash: Rep[String] = column[String]("password_hash")
  val createdAt: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]
      ("created_at", SqlType("TIMESTAMP NOT NULL DEFAULT current_timestamp"))
}
case class User(
  id: Long,
  name: String,
  email: String,
  phone: String,
  passwordHash: String,
  createdAt: Timestamp) 
case class UserUpdate(
  id: Long,
  name: Option[String],
  email: Option[String],
  phone: Option[String],
  passwordHash: Option[String])
我正在使用slick with Play,所以我想我应该基于用户提供的可选json字段构建一个更新案例类,如下所示:

class Users(_tableTag: Tag) extends Table[User](_tableTag, "users") {
  def * = (id, name, email, phone, passwordHash, createdAt) <> (User.tupled, User.unapply)

  val id: Rep[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
  val name: Rep[String] = column[String]("name")
  val email: Rep[String] = column[String]("email")
  val phone: Rep[String] = column[String]("phone")
  val passwordHash: Rep[String] = column[String]("password_hash")
  val createdAt: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]
      ("created_at", SqlType("TIMESTAMP NOT NULL DEFAULT current_timestamp"))
}
case class User(
  id: Long,
  name: String,
  email: String,
  phone: String,
  passwordHash: String,
  createdAt: Timestamp) 
case class UserUpdate(
  id: Long,
  name: Option[String],
  email: Option[String],
  phone: Option[String],
  passwordHash: Option[String])

如何创建一个灵活的3.1查询来更新此更新对象中类型为
Some(value)
的字段

正如@insan-e所建议的,您可以通过
userUpdate.id
获取
existingUser
,并使用
existingUser.field.getOrElse(existingUser.field)
进行更新


目前,使用slick api在单个更新查询中不可能做到这一点,这是一个已知的

您可以获取旧的
oldUser:User
记录,并执行
UserUpdate.field.getOrElse(oldUser.field)
@insan-e是的,这可以工作,但需要两个查询(选择,然后更新)。我想在一个更新查询中完成它。看起来这是目前可用的最好的方法。