【问题标题】:silverstripe-graphql mutations using alternate ID使用备用 ID 的 silverstripe-graphql 突变
【发布时间】:2018-03-06 03:01:53
【问题描述】:

我正在尝试编写一个 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-graphql 和 graphql.org 文档。

【问题讨论】:

    标签: php graphql silverstripe-4


    【解决方案1】:

    我无法使用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-06-20
      • 1970-01-01
      • 2020-02-18
      • 2018-07-27
      • 1970-01-01
      • 2020-05-30
      • 2019-03-09
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多