【问题标题】:Create nested doctine objects with one GraphQl query with API Platform使用 API 平台使用一个 GraphQl 查询创建嵌套的 doctine 对象
【发布时间】:2025-12-10 21:05:02
【问题描述】:

我的 symfony 应用程序中有一个基本实体:

/**
* @ApiResource()
* @ORM\Entity(repositoryClass=CardRepository::class)
*/
class Card
{
   /**
    * @ORM\Id()
    * @ORM\GeneratedValue()
    * @ORM\Column(type="integer")
    */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity=CardReference::class, mappedBy="card", orphanRemoval=true)
 */
    private $cardReferences;

    /**
    * @ORM\Column(type="string", length=255, nullable=true)
    */
   private $name;

如您所见 - 还有另一个实体:CardReference 具有 OneToMany 关系。

所以现在 - 当我创建一个新的 Card 时:

mutation AddCard($name: String!) {
    createCard(input: { name: $name }) {
        card {
            name
        }
    }
}

我想知道如何创建CardReference。 因为这每次都齐头并进。每个Card 至少需要一个CardReference - 因此应在创建卡片时创建一个默认值。

之后使用另一个 GraphQL 查询是否是正确的方法? 或者这是编写custom resolver 的用例?

【问题讨论】:

    标签: symfony graphql doctrine apollo-client api-platform.com


    【解决方案1】:

    早期用于允许嵌套子资源创建的API平台,该案例受RFC规范标准化。

    有关详细信息,请参阅问题 #3258。 现在,您可以单独创建 cardRefrence 并将其 IRI 提供给您的 Card 资源,以使用标准资源访问模式。

    mutation AddCard($name: String!) {
        createCard(input: { 
            name: $name 
            cardReferences: [
                '/card_references/1',
                '/card_references/2'
                #... other IRI etc.
            ]
            }) {
            card {
                name
                #... Access CardReference Relay here which will return related IRI
            }
        }
    }
    

    注意:您可以使用自定义突变来实现这一点,但在我看来和经验使 api 平台超出规范和标准总是会产生其他一系列问题,您必须处理这些问题。尝试以这样一种方式创建模式,它允许您足够灵活地将数据模型与底层 DB 模式分开,您通常最终会为您定义的类型编写自己的持久化器、dto、数据提供者和解析器。

    请将此笔记视为盐粒,因为在某些用例中 api-platform 提供了快速设置 api 的易用性和我的问题 got 可能与此处无关。

    【讨论】: