具有可选值的幻像更新模型

时间:2016-09-15 02:56:58

标签: scala phantom-dsl

我的模型上有一个更新方法,它接受带有选项类型的类,我想构建一个更新语句,其中包含一个动态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(_ => ())
}

现在我试图转移到Phantom-dsl(1.27)的最新版本,而我只是使用dsl来完成等效操作时遇到了麻烦。由于任何字段都可以是None,因此构造第一个modify()然后继续使用任意数量的and(),这是很困难的。

有关如何处理此问题的任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:2)

使用setIfDefined可以做到这一点,你不需要包装任何东西。

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

这基本上会忽略None的所有内容,并且会强制它们不在查询中显示。