1

我正在尝试编写一个 GraphQL 突变来进行更新。在此应用程序中,名为 QuickPossession 的 DataObject 包含对应于第 3 方数据库的第二个 ID。我需要根据第二个 ID 更新 QuickPossessions。这是模型:

<?php
namespace Organization\HomeBuilderSite\DataObjects;

use SilverStripe\ORM\DataObject;
use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffoldingProvider;
use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder;

class QuickPossession extends DataObject implements ScaffoldingProvider {
  private static $table_name = 'QuickPossession';

  private static $db = [
    'SecondID' => 'Int',
    'Title' => 'Varchar(255)',
    'Address' => 'Varchar(255)',
    'SquareFeet' => 'Int',
  ];

  public function provideGraphQLScaffolding(SchemaScaffolder $scaffolder) {
    $scaffolder
      ->type(QuickPossession::class)
        ->addFields([
          'SecondID', 
          'ID',
          'Title',
          'Address', 
          'SquareFeet'
        ])
        ->operation(SchemaScaffolder::CREATE)
          ->end()
        ->operation(SchemaScaffolder::READ)
          ->end()
        ->operation(SchemaScaffolder::UPDATE)
          ->end()
        ->end();
    return $scaffolder;
  }
}

而在我的mysite.yml

SilverStripe\GraphQL\Controller:
  schema:
    scaffolding_providers:
      - Organization\HomeBuilderSite\DataObjects\QuickPossession

我能够成功运行以下突变:

mutation UpdateQuickPossession($ID: ID!, $Input: QuickPossessionUpdateInputType!) {
    updateQuickPossession(ID: $ID, Input: $Input) {
        Title
    }
}

使用这些变量:

{
    "ID": "3",
    "Input": {
        "Title": "Example Home Name",
        "Address": "123 Smith Street"
    }
}

正确地给出了这个输出:

{
    "data": {
        "updateQuickPossession": {
            "Title": "Example Home Name"
        }
    }
}

但我不知道如何使用 SecondID 作为唯一标识符来做同样的事情。我尝试了以下方法:

mutation UpdateQuickPossession($ID: SecondID!, $Input: QuickPossessionUpdateInputType!) {
    updateQuickPossession(SecondID: $ID, Input: $Input) {
        Title
    }
}

使用这些变量:

{
    "SecondID": "1457",
    "Input": {
        "Title": "Example Home Name",
        "Address": "123 Smith Street"
    }
}

这会产生此错误:

{
    "data": null,
    "errors": [
        {
            "message": "Unknown type \"SecondID\".",
            "locations": [
                {
                    "line": 1,
                    "column": 37
                }
            ]
        },
        {
            "message": "Unknown argument \"SecondID\" on field \"updateQuickPossession\" of type \"Mutation\".",
            "locations": [
                {
                    "line": 2,
                    "column": 24
                }
            ]
        },
        {
            "message": "Field \"updateQuickPossession\" argument \"ID\" of type \"ID!\" is required but not provided.",
            "locations": [
                {
                    "line": 2,
                    "column": 2
                }
            ]
        }
    ]
}

我的问题是:突变只适用于主 ID 吗?是否可以使用替代的唯一标识符?

还是我错过了其他东西?也许这是使用脚手架方法为 GraphQL 查询设置 DataObjects 的限制?非常感谢 :)

我一直在参考silverstripe-graphqlgraphql.org文档。

4

1 回答 1

0

我无法使用 来执行此操作SchemaScaffolder::UPDATE,但我能够根据silverstripe-graphql文档编写任意突变。

<?php
namespace Organization\HomeBuilderSite\Pages;

use Organization\HomeBuilderSite\Page;
use SilverStripe\GraphQL\Scaffolding\Interfaces\ScaffoldingProvider;
use SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder;

class QuickPossession extends Page implements ScaffoldingProvider {
  private static $table_name = 'QuickPossession';
  private static $db = [
    'SecondID' => 'Varchar(30)',
    'Title' => 'Varchar(255)',
    'Address' => 'Varchar(255)',
    'SquareFeet' => 'Int',
  ];

  public function provideGraphQLScaffolding(SchemaScaffolder $scaffolder) {
    $scaffolder
      // Setting up QuickPossessions for queries
      ->type(QuickPossession::class)
        ->addFields([
          'SecondID', 
          'ID',
          'Title',
          'Address', 
          'SquareFeet',
          'Community'
        ])
        ->operation(SchemaScaffolder::READ)
          ->end()

      ->mutation('updateQuickPossession', QuickPossession::class)
        ->addArgs([
          'SecondID' => 'ID!',
          'Title' => 'String',
        ])
        ->setResolver(function ($obj, $args, $context) {
          $item = QuickPossession::get()->filter('SecondID',$args['SecondID'])->first();
          $item->SecondID = $args['SecondID'];
          $item->Title = $args['Title'];
          $item->write();
          return $item;
        })
        ->end();
    return $scaffolder;
  }

然后我可以运行一个突变:

mutation UpdateQuickPossession($SecondID: ID!, $Title: String) {
    updateQuickPossession(SecondID: $SecondID, Title: $Title) {
            ID
            SecondID
            Title
            SquareFeet
            Address
    }
}

使用查询变量:

{
    "SecondID": "1",
    "Title": "Clarkson"
}

这成功地给了我:

{
    "data": {
        "updateQuickPossession": {
            "ID": "9",
            "SecondID": "1",
            "Title": "Clarkson",
            "SquareFeet": 2123,
            "Address": "123 Smith Rd"
        }
    }
}

看起来需要自定义mutation()才能覆盖ID作为主要标识符的使用。到目前为止,唯一的缺点是我不清楚如何$Input: QuickPossessionUpdateInputType!在此方法中定义和使用复杂的输入类型(即。)。

于 2018-03-05T19:01:53.497 回答