鉴于以下Slick代码:
val doUpdate = true
val table1 = TableQuery[Table1DB]
val table2 = TableQuery[Table2DB]
val table3 = TableQuery[Table3DB]
val action = (for {
_ <- table1.filter(_.id === id).update(table1Record)
_ <- table2.filter(_.id === id).update(table2Record)
_ <- table3.filter(_.id === id).update(table3Record)
} yield ()).transactionally
如果变量doUpdate为true,我需要更新table2
和table3
。这是我的尝试:
val action = (for {
_ <- table1.filter(_.id === id).update(table1Record)
_ <- table2.filter(_.id === id).update(table2Record)
if (doUpdate == true)
_ <- table3.filter(_.id === id).update(table3Record)
if (doUpdate == true)
} yield ()).transactionally
这个编译,但是当我运行它时,我得到以下错误Action.withFilter failed
。如何添加条件?
答案 0 :(得分:5)
如果您注意到if
内部使用了for
,则会在下面调用withFilter
。对于管道(DBIO
,Future
s,Task
s),过滤归结为是否继续管道(幸福路径)或失败(生成{{1}或类似的。)
如果您想要更新,那么您可以使用Failure
道路并恢复if
。但是,它会让我们难看,因为根据你写Future
的方式,它也可能会从你希望被告知的错误中恢复过来。
替代方法是简单地使用if-else来提供不同的case
:
DBIOAction
在你的情况下,它可能看起来像:
(for {
_ <- {
if (doUpdate) conditionalAction.map(_ => ())
else DBIOAction.successful(())
}
} yield ()).transactionally