首页 > 解决方案 > 如何在 apiplatform/graphql 上创建/突变具有子关系的实体

问题描述

我想创建两个相关的实体。如何创建具有所需子实体的第一个实体。

我尝试了以下代码,但 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
        }
      ]
    }
  ]
}

突变:

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

    product {
      uuid
      name
      sku
    }
  }
}

变量:

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

奇怪的是 createProductInput 说 stock 是一个字符串而不是一个对象。

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

这些是我的实体:

// 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;
}

标签: phpsymfonydoctrinegraphqlapi-platform.com

解决方案


您不能在突变中创建嵌套实体,您需要先创建嵌套实体,然后在突变中使用其 IRI。这就是类型为String的原因。

以前是可能的,但已被删除,因为它导致了一些问题。见:https ://github.com/api-platform/core/pull/1886


推荐阅读