GraphiQL на Orchard-Core: «где» и «фильтр» не работает

#orchardcms #graphiql #orchardcore

Вопрос:

Я пытаюсь понять, как выполнять запросы с помощью GraphiQL на Orchard-Core, и я сталкиваюсь с некоторыми проблемами, которые я не могу исправить:

Я пытаюсь реализовать чрезвычайно простой запрос:

 query MyQuery ($myDesc: String) {
  product (where: {description: $myDesc}) {
    description
  }
}
 

Когда я пытаюсь воспроизвести запрос, я получаю следующую ошибку:

 {
  "errors": [
    {
      "message": "Argument "where" has invalid value {description: $myDesc}.nIn field "description": Unknown field.",
      "locations": [
        {
          "line": 17,
          "column": 11
        }
      ],
      "extensions": {
        "code": "5.3.3.1"
      }
    }
  ]
}
 

В нем говорится, что «Поле «описание» не определено типом «productWhereInput»»

Мне нужно применить к продуктам кучу фильтров, чтобы получить желаемый результат, но ни один из них не работает. Я также пытался использовать «filter» вместо «where», но затем я получаю другую ошибку: «Неизвестный аргумент «filter» в поле «Query.product». ‘

Глядя на некоторые документы, кажется, что использовать GraphiQL не так сложно, но когда я пытаюсь написать код так, как я нахожу его в документах, он выдает мне ошибки за ошибками здесь, в Orchard-Core.

Ответ №1:

Существует только ограниченное количество фильтров where, реализованных по умолчанию. Из-за ошибки, которую вы получаете, вы не реализовали WhereInputObjectGraphType со своей стороны.

Один из способов — создать yessql mapIndex для полей, которые вы хотите иметь возможность запрашивать. Я предполагаю, что описание — это текстовое поле. Итак, сначала создайте класс ProductPartIndex как YesSQL mapIndex, который будет сопоставлять описание каждого элемента содержимого с ProductPart. После этого вам нужно соединить индекс с GraphQL WhereInputObjectType .

 public class ProductInputObjectType : WhereInputObjectGraphType<ProductPart>
{
    public ProductInputObjectType(IStringLocalizer<ProductInputObjectType> S)
    {
        AddScalarFilterFields<StringGraphType>("description", S["product description"]);
    }
}

public class ProductPartIndexAliasProvider : IIndexAliasProvider
{
    private static readonly IndexAlias[] _aliases = new[]
    {
        new IndexAlias
        {
            Alias = "ProductPart",
            Index = nameof(ProductPartIndex),
            IndexType = typeof(ProductPartIndex)
        }
    };

    public IEnumerable<IndexAlias> GetAliases()
    {
       return _aliases;
    }
}

[RequireFeatures("OrchardCore.Apis.GraphQL")]
public class Startup : StartupBase
{
    public override void ConfigureServices(IServiceCollection services)
    {
        services.AddInputObjectGraphType<ProductPart, ProductInputObjectType>();
        services.AddTransient<IIndexAliasProvider, ProductPartIndexAliasProvider>();
        services.AddWhereInputIndexPropertyProvider<ProductPartIndex>();
    }
}
 

Это код adhoc, не тестировал его. Все здесь является измененной версией AliasPart из исходного кода.