2016-09-15 20 views
1

我的模型上有一個更新方法,它帶有一個帶有選項類型的類,並且我想構造一個包含動態SET的更新語句,具體取決於哪些字段具有值。使用Phanton-dsl 1.5我有類似的東西;具有可選值的幻影更新模型

import com.websudos.phantom.query.{ AssignmentsQuery => AQ } 

override def updateModel(m: Upd)(implicit ec: EC): Future[Unit] = { 
    if (m.isEmpty) return Future.successful(()) 
    val upd = update 
    upd.where(_.user_id eqs m.user_id) 
    val mod: AQ[CTable, Val] = new AQ(this, upd.qb.`with`()) 
    for (first_name <- m.first_name) mod.and(_.first_name setTo first_name) 
    for (last_name <- m.last_name) mod.and(_.last_name setTo last_name) 
    mod.future.map(_ =>()) 
} 

現在我想要移動到幻影-DSL(1.27)的最新版本,我有做與僅使用DSL相當於麻煩。由於任何字段都可能是None,因此構造第一個修改(),然後使用任意數量的and()進行處理變得困難。

有關如何處理此問題的任何建議將會有所幫助。

回答

2

這是可能的使用setIfDefined,你不需要包裝任何東西。

db.table.update.where(_.bla eqs bla) 
    .modify(_.x setIfDefined None) 
    .and(_.y setIfDefined Some("text") 

這將基本上忽略所有的東西None,它會強制他們不顯示在查詢中。

+0

當我嘗試「setIfDefined」我得到這個錯誤'setIfDefined值不是對象的X .modify(_。FIRST_NAME setIfDefined FIRST_NAME)' –

+0

什麼版本的幻象您使用的是$ 9.first_name [錯誤]成員? – flavian

+0

我使用的版本是1.27.0 –