2013-05-26 4 views
1

Могу ли я построить запрос на обновление с переменным числом полей без использования простого SQL?Могу ли я построить запрос на обновление с переменными полями без использования простого SQL?

Например, обновление одного столбца прост - я просто даю ему создать узкий запрос.

Query(RolesTable).filter((role: RolesTable.type) => role.id === role_id).map((role: RolesTable.type) => role.name).update(name) 

Но что, если Role имеет 5 полей, и я хочу, чтобы клиент API выслать поля он хочет обновить? Как мне построить такой запрос?

ответ

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 _) 
} 

A Выбор основан на вашем примере будет выглядеть следующим образом:

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)) 
+0

Но что делать, если поля, которые должны быть конкатенированы, будут известны только во время выполнения? – expert

+1

Я предполагаю, что вы не можете сделать это с моим подходом сверху. Объединение столбцов вместе создает проекцию, которая статически типизируется для столбцов, которые объединяются вместе. Затем подпись 'update' основана на типах этой проекции и может быть проверена на правильность во время компиляции. Я просто не знаю, как это будет работать с динамическим списком столбцов, а затем с динамическим набором значений для вызова «update». – cmbaxter