使用备用 ID 的 silverstripe-graphql 突变
silverstripe-graphql mutations using alternate ID
我正在尝试编写 GraphQL 变更来进行更新。在此应用程序中,名为 QuickPossession 的 DataObject 包含第二个 ID,它对应于第 3 方数据库。我需要根据第二个 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 and graphql.org 文档。
我无法使用 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!
)。
我正在尝试编写 GraphQL 变更来进行更新。在此应用程序中,名为 QuickPossession 的 DataObject 包含第二个 ID,它对应于第 3 方数据库。我需要根据第二个 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 and graphql.org 文档。
我无法使用 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!
)。