我使用Play 2.2.x和Slick 2.0(使用MYSQL后端)编写REST API。我有一个User
模型,其中包含age
,name
,gender
等字段。我想创建一个路径PATCH /users/:id
,它接收部分用户对象(即完整用户模型的字段的子集)在正文中并更新用户的信息。我很困惑如何实现这个目标:
PATCH
动词?update users set age=?, dob=? where id=?
答案 0 :(得分:0)
免责声明:我没有使用Slick,所以我只是按照他们关于Plain SQL Queries的文档进行操作。
回答你的第一个问题:
PATCH
只是您routes
文件中的另一个HTTP动词,因此对于您的示例:
PATCH /users/:id controllers.UserController.patchById(id)
您的UserController
可能是这样的:
val possibleUserFields = Seq("firstName", "middleName", "lastName", "age")
def patchById(id:String) = Action(parse.json) { request =>
def addClause(fieldName:String) = {
(request.body \ fieldName).asOpt[String].map { fieldValue =>
s"$fieldName=$fieldValue"
}
}
val clauses = possibleUserFields.flatMap ( addClause )
val updateStatement = "update users set " + clauses.mkString(",") + s" where id = $id"
// TODO: Actually make the Slick call, possibly using the 'sqlu' interpolator (see docs)
Ok(s"$updateStatement")
}
这是做什么的:
定义PATCH
JSON
定义将传入主体解析为JSON
迭代所有可能的字段名称,测试它们是否存在于传入的JSON中
如果是这样,请将表单fieldname=<newValue>
添加到列表中
构建SQL更新语句,根据需要用逗号分隔每个子句
我不知道这对你来说是否足够通用,可能有办法从Slick中获取字段名称(即Slick列名称),但就像我说的那样,我甚至不是Slick用户,更不用说专家了: - )