2017-04-11 19 views
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", 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")) 
} 

User例类看起来是这样的:

case class User(
    id: Long, 
    name: String, 
    email: String, 
    phone: String, 
    passwordHash: String, 
    createdAt: Timestamp) 

我使用的Play光滑,所以我想我会建立一个更新案例类基于用户提供可选的JSON领域是这样的:

case class UserUpdate(
    id: Long, 
    name: Option[String], 
    email: Option[String], 
    phone: Option[String], 
    passwordHash: Option[String]) 

我怎样才能让一个漂亮的3.1查询更新在这个更新对象是Some(value)类型的字段?

+0

你可以取老'oldUser:User'记录,并做'UserUpdate.field.getOrElse(oldUser .field)' –

+0

@ insan -e是的,这将工作,但需要2个查询(选择,然后更新)。我想在一个更新查询中完成它。 –

回答

0

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

现在它是不可能使用华而不实的API做单更新查询,这是一个已知issue

+0

看起来这是现在可用的最佳方式。 –