From 782cea9bd725c27b9c80b4295084393a9f6b4b53 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 2 Jul 2021 16:25:03 +1200 Subject: [PATCH] FIX Avoid inferring model type Since Versioned->versions() results in an ArrayList, it triggers database queries. The database isn't always available when the schema is built (e.g. on deployment and CI environments). Context: https://github.com/silverstripe/silverstripe-graphql/issues/388 --- src/GraphQL/Plugins/VersionedDataObject.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/GraphQL/Plugins/VersionedDataObject.php b/src/GraphQL/Plugins/VersionedDataObject.php index a113b540..0f6f27e8 100644 --- a/src/GraphQL/Plugins/VersionedDataObject.php +++ b/src/GraphQL/Plugins/VersionedDataObject.php @@ -21,6 +21,7 @@ use SilverStripe\Versioned\GraphQL\Resolvers\VersionedResolver; use SilverStripe\Versioned\Versioned; use Closure; +use SilverStripe\GraphQL\Schema\Field\ModelField; // GraphQL dependency is optional in versioned, // and the following implementation relies on existence of this class (in GraphQL v4) @@ -110,7 +111,12 @@ public function apply(ModelType $type, Schema $schema, array $config = []): void } $schema->addType($versionType); - $type->addField('versions', '[' . $versionName . ']', function (Field $field) use ($type, $schema, $config) { + $versionsFieldConfig = new ModelField('versions', [ + 'type' => '[' . $versionName . ']', + // TODO This isn't the actual resolvedModelClass, it just avoids triggering database queries through inference + 'resolvedModelClass' => $type->getModel()->getSourceClass() + ], $type->getModel()); + $type->addField('versions', $versionsFieldConfig, function (Field $field) use ($type, $schema, $config) { $field->setResolver([VersionedResolver::class, 'resolveVersionList']) ->addResolverContext('sourceClass', $type->getModel()->getSourceClass()); SortPlugin::singleton()->apply($field, $schema, [