简体   繁体   English

如何在 apiplatform/graphql 上创建/变异具有子关系的实体

[英]How to create/mutation entity with sub relation on apiplatform/graphql

I want to create two entities that are related.我想创建两个相关的实体。 How can I create the first entity with the required sub-entity.如何使用所需的子实体创建第一个实体。

I've tried the following code but graphql returns the following error:我尝试了以下代码,但 graphql 返回以下错误:

{
  "errors": [
    {
      "message": "Variable \"$stock\" of type \"createProductInput!\" used in position expecting type \"String\".",
      "extensions": {
        "category": "graphql"
      },
      "locations": [
        {
          "line": 7,
          "column": 3
        },
        {
          "line": 15,
          "column": 17
        }
      ]
    }
  ]
}

The mutation:突变:

mutation createProduct ($input: createProductInput!) {
  createProduct(input: $input) {
    clientMutationId

    product {
      uuid
      name
      sku
    }
  }
}

the variables:变量:

{
  "input": {
    "name": "ProductAAA",
    "sku": "product_aaa",
    "stock": {
      "quantity": 33,
      "unit": "s"
    }
  }
}

Oddly the createProductInput says that stock is a string instead of an object.奇怪的是 createProductInput 说 stock 是一个字符串而不是一个对象。

uuid: String!
name: String!
sku: String!
stock: String
clientMutationId: String

These are my entities:这些是我的实体:

// Product.php

use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiSubresource;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource
 * @ApiFilter(ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter::class, properties={"name": "partial", "sku": "partial"})
 *
 * @ORM\Table(name="products")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\Column(name="product_id", type="uuid", unique=true)
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
     *
     * @ApiProperty(identifier=true)
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @ORM\Column(type="string")
     */
    private $sku;

    /**
     * @ORM\ManyToOne(targetEntity="Stock", cascade={"PERSIST"})
     * @ORM\JoinColumn(name="stock_id", referencedColumnName="stock_id")
     *
     * @ApiSubresource
     */
    private $stock;
}
// Stock.php

use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource
 *
 * @ORM\Table(name="stocks")
 */
class Stock
{
    /**
     * @ORM\Id
     * @ORM\Column(name="stock_id", type="uuid", unique=true)
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
     *
     * @ApiProperty(identifier=true)
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $quantity;

    /**
     * @ORM\Column(type="string")
     */
    private $unit;
}

You cannot create a nested entity in a mutation, you need to create the nested entity first then use its IRI in the mutation.您不能在突变中创建嵌套实体,您需要先创建嵌套实体,然后在突变中使用其 IRI。 That's why the type is String .这就是类型为String的原因。

It was possible before but has been removed because it was causing some issues.以前是可能的,但已被删除,因为它导致了一些问题。 See: https://github.com/api-platform/core/pull/1886见: https : //github.com/api-platform/core/pull/1886

following your question I created the first entity through its own mutation. 根据您的问题,我通过自己的突变创建了第一个实体。 Then when I want to use it in the second one, nothing happen. 然后,当我想在第二个中使用它时,什么也没发生。 My Cart Item is persisted without any Poster linked to it. “我的购物车商品”保留不变,未链接任何海报。 I don't understand why. 我不明白为什么。 Here are my codes : 这是我的代码:

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\CartRepository")
 */
class Cart
{
    /**
     * @ApiSubresource
     * @ORM\OneToMany(targetEntity="Poster", mappedBy="cart")
     */
    private $posters;
}

GraphQL mutation: GraphQL突变:

mutation AddCart(
    $posters: [String]!
  ) {
    createCart(input: {
      posters: $posters
    }) {
      cart {
        id,
        posters {
          edges {
            node {
              id
            }
          }
        }
      }
    }
  }

Variables: 变量:

{
  "posters": [
    "/api/posters/4733d25c-c37b-4162-b25b-fabb3e58177e"
  ]
}

I obviously did a mistake somewhere :) Do you think you can help me? 我显然在某个地方犯了一个错误:)你认为你可以帮助我吗? Thanks a lot! 非常感谢!

mutation CreateUser{
  createUser(input: {
    email: "user@test.com", 
    username: "user@test.com", 
    role: "ROLE_USER",
    password: "bonjour",
    enabled: true,
  }) {
    user{
        id
      email
      username
      role
      reference
      enabled
      created
      updated
    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM