微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

api平台graphql-在一个突变中创建多个项目 1.这些应该在串行执行2.这些应该并行执行

如何解决api平台graphql-在一个突变中创建多个项目 1.这些应该在串行执行2.这些应该并行执行

我有一个User实体,可以使用GooglePeopleApi从Google添加他/她的联系人。

API按原样提供了与前端的联系人数组(Nextjs)。问题是如何将所有这些联系人插入单个突变中。

我当然可以让前端循环遍历数组,然后逐个发布联系人,但这有点愚蠢。

应该可以使用Contact输入创建一个类型数组,然后使用它来设置customArgsMutation。 (我从Hasura看到了一些例子)。

明智的做法,现在看起来像这样(仅相关代码):

User.PHP

 ....
/**
 * @ORM\OnetoMany(targetEntity="App\Entity\Contact",mappedBy="user")
 * @Groups({"put-contacts","get-admin","get-owner"})
 */
private $contacts;

Contact.PHP

/**
* @ApiResource(
*      attributes={"pagination_enabled"=false},*      graphql={
*          "item_query"={
*              "normalization_context"={"groups"={"get-admin","get-owner"}},*          },*          "collection_query"={
*              "normalization_context"={"groups"={"get-admin",*          "delete"={"security"="is_granted('IS_AUTHENTICATED_FULLY') and object.getUser() == user"},*          "create"={
*              "security"="is_granted('IS_AUTHENTICATED_FULLY')",*              "denormalization_context"={"groups"={"post","put"}},*              "normalization_context"={"groups"={"get-owner","get-admin"}},*      }
* )
* @ORM\Entity(repositoryClass="App\Repository\ContactRepository")
*/
class Contact
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\User",inversedBy="contacts")
 * @Groups({"post","get-owner"})
 */
private $user;

/**
 * @ORM\Column(type="string",length=180)
 * @Groups({"post","put","get-owner"})
 */
private $email;

/**
 * @ORM\Column(type="string",length=180,nullable=true)
 * @Groups({"post","get-owner"})
 */
private $familyName;

/**
 * @ORM\Column(type="string","get-owner"})
 */
private $givenname;

/**
 * @ORM\Column(type="string","get-owner"})
 */
private $displayName;

graphiql中,createContact输入看起来像这样:

 user: String
 email: String!
 familyName: String
 givenname: String
 displayName: String
 clientMutationId: String

解决方法

这里有几个选项,具体取决于您想要的并发量:

1.这些应该在串行执行

客户端可以使用多个突变作为别名发出单个 HTTP 请求:

mutation CreateUsers {
  user1: createUser({ //userInput1 }) { ...userFields }
  user2: createUser({ //userInput2 }) { ...userFields }
  user3: createUser({ //userInput3 }) { ...userFields }
}

fragment userFields on CreateUserPayload {
  firstName
  // etc
}

响应将如下所示:

{
  "data": {
    "user1": {...},"user2": {...},"user3": {...},}
}

优点

  • 如果任何一个突变失败,那一个突变会在没有特殊处理的情况下出错
  • 维持秩序。由于 API 使用者专门标记了突变,因此他们知道哪个具有哪些结果。

缺点

  • 按照设计,多个变更在 Serial 中运行,其中第一个必须在下一个开始之前完全完成。因此,它会变慢一些。
  • 客户端必须自己添加字段或为每个突变使用一个片段(我上面展示的)

2.这些应该并行执行

创建一个允许您创建多个用户的“批量突变”是一种常见的做法(我猜这很常见)。

mutation CreateUsers {
  createUsers([
    { //userInput1 },{ //userInput2 },{ //userInput3 }
  ]) {
    firstName
    // etc
  }
}

优点

  • 并行运行,因此速度更快
  • 客户端不必进行字符串插值来构建查询。他们只需要传入的对象数组。

缺点

  • 您必须自己构建逻辑才能自行返回空值与错误。
  • 你必须建立逻辑来维持秩序
  • 如果客户关心顺序,他们必须构建逻辑以在响应数组中找到他们的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。