我可以使用可变数量的字段构建更新查询而不使用纯SQL吗?
例如,单列的更新很简单 - 我只是让它来创建窄查询。
Query(RolesTable).filter((role: RolesTable.type) => role.id === role_id).map((role: RolesTable.type) => role.name).update(name)
但是如果Role
有5个字段并且我想允许API客户端向我发送他想要更新的字段呢?我该如何构建这样的查询?
答案 0 :(得分:3)
这里的关键是在产生所选列时使用~
运算符。使用文档中的示例模型:
case class User(id: Option[Int], first: String, last: String)
object UsersTable extends Table[User]("users") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def first = column[String]("first")
def last = column[String]("last")
def * = id.? ~ first ~ last <> (User, User.unapply _)
}
基于您的示例的选择将如下所示:
val cols = Query(UsersTable).filter((user: UsersTable.type) => user.id === userId).map((user: UsersTable.type) => user.first ~ user.last)
然后update
调用将是:
cols.update((newFirst,newLast))
另外,如果你想,你可以重新编写你的选择作为理解,因为它会缩短一点:
val cols = for(user <- UsersTable if (user.id === userId)) yield user.first ~ user.last
cols.update((newFirst,newLast))