如果参数不为空,如何有选择地更新字段

时间:2019-07-16 13:47:29

标签: scala slick slick-3.0

我有一个带有不可为空的列的表:

class Users(tag: Tag) extends Table[User](tag, "users") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def surname = column[String]("surname")
}

我只想更新一些列(如果不是None):

  def update(id: String, name: Option[String], surname: Option[String]) = {
    (name, surname) match {
      case (Some(n), Some(s)) => byId(id)
        .map(l => (l.name, l.surname))
        .update((n, s))
      case (None, Some(s)) => byId(id)
        .map(l => (l.surname))
        .update(s)
      case (Some(n),None) => byId(id)
        .map(l => (l.name))
        .update(n)
    }
  }

是否有更优雅的方法来做到这一点?如果有很多更新参数怎么办?

1 个答案:

答案 0 :(得分:1)

尽管我可以进行两个查询,但是我可以选择使用现有查询,并且始终只进行一个更新:

  def byId(id: String) = ???

  def update(id: String, name: Option[String], surname: Option[String]) = {
    val filterById = byId(id).map(u => (u.name, u.surname))
    for {
      (existingName, existingSurname) <- filterById.result.head
      rowsAffected <- filterById.update((name.getOrElse(existingName), surname.getOrElse(existingSurname)))
    } yield rowsAffected
  }

PD :对于大型对象也是如此。.我们映射了整行,然后制作了一种补丁来再次对其进行更新