这个问题与slick相关:我有三个表:
1)用户
2)Team2members
3)Team2Owners
在我对用户的post请求中,我传递了memberOf和managerOf的值,这些值将分别插入到表Team2members和Team2Owners中,而不是插入到users表中。尽管post请求的其他值将被插入'Users‘表中。
我的Post请求如下所示:
{"kind": "via#user",
"userReference":{"userId":"priya16"},
"user":"preferredNameSpecialChar@domain1.com","memberOf":{"teamReference":{"organizationId":"airtel","teamId":"supportteam"}},
"managerOf":{"teamReference":{"organizationId":"airtel","teamId":"supportteam"}},
"firstName":"Special_fn1",
"lastName":"specialChar_ln1",
"preferredName":[{"locale":"employee1","value":"@#$%^&*(Z0FH"}],
"description":" preferredNameSpecialChar test "} 我正在构造查询,如下所示:
当只定义了memberInsert时,查询似乎工作得很好,当我尝试定义两个值,即memberInsert和managerInsert时,只对第二个值进行插入。
val query = config.api.customerTableDBIO(apiRequest.parameters.organizationId).flatMap { tables =>
val userInsert = tables.Users returning tables.Users += empRow
val memberInsert = inputObject.memberOf.map(m => m.copy(teamReference = m.teamReference.copy(organizationId = apiRequest.parameters.organizationId))).map { r =>
for {
team2MemberRow <- tables.Team2members returning tables.Team2members += Teams2MembersEntity.fromEmtToTeams2Members(r, empRow.id)
team <- tables.Teams.filter(_.id === r.teamReference.teamId.toLowerCase).map(_.friendlyName).result.headOption
} yield (team2MemberRow, team)
}
val managerInsert = inputObject.managerOf.map(m => m.copy(teamReference = m.teamReference.copy(organizationId = apiRequest.parameters.organizationId))).map { r =>
for {
team2OwnerRow <- tables.Team2owners returning tables.Team2owners += Teams2OwnersEntity.fromEmtToTeam2owners(r, empRow.id)
team <- tables.Teams.filter(_.id === r.teamReference.teamId.toLowerCase).map(_.friendlyName).result.headOption
} yield (team2OwnerRow, team)
}
userInsert.flatMap { userRow =>
val user = UserEntity.fromDbEntity(userRow)
if (memberInsert.isDefined) memberInsert.get
.map(r => user.copy(memberOf = Some(Teams2MembersEntity.fromEmtToMemberRef(r._1, r._2.map(TeamEntity.toApiFriendlyName).getOrElse(List.empty)))))
else DBIO.successful(user)
if (managerInsert.isDefined) managerInsert.get
.map(r => user.copy(managerOf = Some(Teams2OwnersEntity.fromEmtToManagerRef(r._1, r._2.map(TeamEntity.toApiFriendlyName).getOrElse(List.empty)))))
else DBIO.successful(user)
}
}发布于 2020-02-27 17:15:21
当只定义了memberInsert时,查询似乎工作得很好,当我尝试定义i.e.memberInsert和managerInsert两个值时,只对第二个值进行插入。
问题似乎出在对flatMap的最后一次调用上。
这应该返回一个DBIO[T]。但是,您的表达式在各个分支中生成一个DBIO[T],但是从flatMap中只返回一个值。这就解释了为什么你看不到所有正在运行的操作。
相反,您可以做的是为每个步骤分配一个值并对它们进行排序。有lots of ways you could do that,比如使用DBIO.seq或andThen。
以下是一种可能适用于您的方法的草图。
val maybeInsertMemeber: Option[DBIO[User]] =
member.map( your code for constructing an action here )
val maybeInsertManager Option[DBIO[User]] =
manager.map( your code for constructing an action here )
DBIO.sequenceOption(maybeInsertMember) andThen
DBIO.sequenceOption(maybeInsertManager) andThen
DBIO.successful(user)该表达式的结果是将三个查询组合在一起的DBIO[User]。
https://stackoverflow.com/questions/60257988
复制相似问题