首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SLICK:使用一个slick api调用在3个不同的表中插入值

SLICK:使用一个slick api调用在3个不同的表中插入值
EN

Stack Overflow用户
提问于 2020-02-17 15:49:54
回答 1查看 43关注 0票数 0

这个问题与slick相关:我有三个表:

1)用户

2)Team2members

3)Team2Owners

在我对用户的post请求中,我传递了memberOfmanagerOf的值,这些值将分别插入到表Team2membersTeam2Owners中,而不是插入到users表中。尽管post请求的其他值将被插入'Users‘表中。

我的Post请求如下所示:

代码语言:javascript
复制
{"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时,查询似乎工作得很好,当我尝试定义两个值,即memberInsertmanagerInsert时,只对第二个值进行插入。

代码语言:javascript
复制
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)
      }
    }
EN

回答 1

Stack Overflow用户

发布于 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.seqandThen

以下是一种可能适用于您的方法的草图。

代码语言:javascript
复制
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]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60257988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档