#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 из исходного кода.