我是 Slick 3 的新手,到目前为止我已经了解 db.run 是异步调用。一旦 Future 返回, .map 或 .flatMap 就会运行。
我下面代码中的问题是所有子查询都不起作用(嵌套的 db.run)。
从概念上讲,我没有得到什么?如下执行这种代码是否有效?基本上在第一个查询的 .map 中,我根据第一个查询执行一些操作。
我到处都可以看到带有 yield 的循环,这是唯一的方法吗?我的代码中的问题是否与返回的 Future 值有关?
val enterprises = TableQuery[Enterprise]
val salaries = TableQuery[Salary]
//Check if entered enterprise exists
val enterpriseQS = enterprises.filter(p => p.name.toUpperCase.trim === salaryItem.enterpriseName.toUpperCase.trim).result
val result=db.run(enterpriseQS.headOption).map(_ match
{
case Some(n) => {
//if an enterprise exists use the ID from enterprise (n.id) when adding a record to salary table
val addSalary1 = salaries += new SalaryRow(0, n.id, salaryItem.worker)
db.run(addSalary1)
}
case None => {
//if an enterprise with salaryItem.enterpriseName doesn't exist, a new enterprise is inserted in DB
val enterpriseId = (enterprises returning enterprises.map(_.id)) += EnterpriseRow(0, salaryItem.enterpriseName)
db.run(enterpriseId).map{
e => {
val salaryAdd2 = salaries += new SalaryRow(0, e, salaryItem.worker)
db.run(salaryAdd2)
}
}
}
})