0

问题与 slick 有关:我有三个表:
1)用户
2)Team2members
3)Team2Owners

在我对用户的发布请求中,我传递 和 的值memberOfmanagerOf这些值将分别插入到表中Team2membersTeam2Owners而不是插入到用户表中。尽管发布请求的其他值将插入“用户”表中。

我的 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 "}  

我正在形成如下所示的查询:当我尝试定义这两个值时
,查询似乎工作正常,即,然后仅对第二个值进行插入。memberInsertmemberInsertmanagerInsert

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)
      }
    }
4

1 回答 1

0

当仅定义 memberInsert 时,查询似乎工作正常,当我尝试同时定义值 iememberInsert 和 managerInsert 时,插入仅针对第二个值发生。

问题似乎出在对flatMap.

那应该返回一个DBIO[T]. 但是,您的表达式会在各个分支中生成 a DBIO[T],但只会从 . 返回一个值flatMap。这可以解释为什么您看不到所有正在运行的操作。

相反,您可以做的是将每个步骤分配给一个值并对其进行排序。有很多方法可以做到这一点,例如使用DBIO.seqor 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]将三个查询组合在一起的 a。

于 2020-02-27T09:15:20.873 回答