如何在 lighthouse-php 中使用 @method 指令正确地提供自定义查询?

Posted

技术标签:

【中文标题】如何在 lighthouse-php 中使用 @method 指令正确地提供自定义查询?【英文标题】:How to properly serve custom queries with @method directive in lighthouse-php? 【发布时间】:2021-07-10 18:22:36 【问题描述】:

我正在使用 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
  

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

【问题讨论】:

【参考方案1】:

在Jason Adams的帮助下我有了问题的答案。

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

    php artisan lighthouse:query StatsReport 像这样在 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;
   


    schema.graphql中创建StatsReport
type Query 
   statsReport: StatsReport


type StatsReport 
   averageDailySale: Float @method

    查询:
query 
  statsReport 
    averageDailySale
  

这样,如果您有复杂的计算,每个方法内部有多个 SQL 查询和复杂的逻辑,您将按需触发它们。

【讨论】:

以上是关于如何在 lighthouse-php 中使用 @method 指令正确地提供自定义查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在lighthouse graphql laravel中获取自定义指令参数?

如何缓存 auth()->user() 与 Laravel 缓存中的角色关系,以减少对数据库的调用?

使用 Laravel Lighthouse 在 Laravel 7 中出现 CORS 错误

在 Perl 中,如何从文件中删除 ^M?

如何在glRotatef中使用glm :: mat4

matlab中全局变量放在一个.m文件中其他m文件如何使用