猿问

如何在 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;

}


米脂
浏览 193回答 2
2回答

喵喔喔

您不能在突变中创建嵌套实体,您需要先创建嵌套实体,然后在突变中使用其 IRI。这就是类型为String的原因。以前是可能的,但已被删除,因为它导致了一些问题。见:https : //github.com/api-platform/core/pull/1886

有只小跳蛙

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    }  }}
随时随地看视频慕课网APP
我要回答