私は Slick 3 が初めてで、これまでのところ db.run が非同期呼び出しであることを理解しています。Future が返されると、.map または .flatMap が実行されます。
以下のコードの問題は、すべてのサブクエリが機能しないことです (ネストされた db.run)。
概念的に言えば、何が得られないのでしょうか? この種のコードを以下のように実行することは有効ですか? 基本的に、最初のクエリの .map で、最初のクエリに応じていくつかのアクションを実行します。
yield を使用した for ループがどこにでもありますが、それが唯一の方法ですか? 私のコードの問題は、返された 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)
}
}
}
})