1

我正在使用 Lighthouse 构建一个库存应用程序,并努力掌握使用复杂逻辑按需提供自定义查询的概念。

这是我正在尝试创建的近似查询:

{
  statsReport {
    dailyTotalSales
    dailyAverageSales
    dailTotalItemsSold
    newDailyCustomersCount
    etc.
  }
}

我正在考虑创建一个对象,它有不同的方法来聚集这些对象。我研究了创建自定义类型,就像这样

<?php

namespace App\Providers;

use GraphQL\Type\Definition\Type;
use Illuminate\Support\ServiceProvider;
use GraphQL\Type\Definition\ObjectType;
use Nuwave\Lighthouse\Schema\TypeRegistry;

class GraphQLServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @param TypeRegistry $typeRegistry
     *
     * @return void
     * @throws \Nuwave\Lighthouse\Exceptions\DefinitionException
     */
    public function boot(TypeRegistry $typeRegistry): void
    {
        $types = [
            new ObjectType(
                [
                    'name'   => 'Stats',
                    'fields' => [
                        'dailyTotalSales' => [
                            'type'        => Type::float(),
                            'description' => 'Daily Total Sales',
                            'resolve'     => function() {
                                return $this->dailyTotalSales();
                            },
                        ],
                    ],
                ]
            ),
        ];
        foreach ($types as $type) {
            $typeRegistry->register($type);
        }
    }
    
    public function dailyTotalSales()
    {
       return 1198.92
    }
    
    public function newDailyCustomersCount()
    {
       return 10
    }

}

我注册了提供者但不知道如何查询这个类型?

还是我做错了,有更好的方法吗?

我必须以schema.graphql某种方式添加它吗?

我可以创建一个自定义查询,但是我必须在__invoke方法中同时要求所有统计信息,我宁愿按需进行。例如,如果我提出这样的请求

{
  statsReport {
    dailyTotalSales
    newDailyCustomersCount
  }
}

我会调用这两个方法执行。

4

1 回答 1

1

由于Jason Adams的帮助,我找到了问题的答案。

为了实现我所尝试的,您必须执行以下操作:

  1. php artisan lighthouse:query StatsReport
  2. 在 StatsReport 类中创建所需的方法(例如averageDailySale),如下所示
<?php

namespace App\GraphQL\Queries;

class StatsReport
{
   public function __invoke($_, array $args)
   {
       // This part is important otherwise it won't work.
       return $this;
   }
 
   public function averageDailySale()
   {
       return 1122.12;
   }
}

  1. 在里面创建StatsReport类型schema.graphql
type Query {
   statsReport: StatsReport
}

type StatsReport {
   averageDailySale: Float @method
}
  1. 查询它:
query {
  statsReport {
    averageDailySale
  }
}

这样,如果您在每个方法和复杂逻辑中使用多个 SQL 查询进行复杂计算,您将按需触发它们。

于 2021-04-16T18:28:47.213 回答