мутации silverstripe-graphql с использованием альтернативного идентификатора

Я пытаюсь написать мутацию GraphQL для обновления. В этом приложении объект DataObject с именем QuickPossession содержит второй идентификатор, соответствующий сторонней базе данных. Мне нужно обновить 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
}
]
}
]
}

У меня такой вопрос: мутации работают только с первичным идентификатором? Можно ли использовать альтернативные уникальные идентификаторы?

Или я что-то упускаю? Возможно, это ограничение использования скаффолд-подхода для настройки объектов DataObject для запросов GraphQL? Большое спасибо 🙂

Я имел в виду SilverStripe-graphql а также graphql.org документация.

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!) в этом методе.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]