在 Laravel Lighthouse 中添加自定义类型和解析器
Posted
技术标签:
【中文标题】在 Laravel Lighthouse 中添加自定义类型和解析器【英文标题】:Add a custom type and resolver in Laravel Lighthouse 【发布时间】:2021-09-11 11:10:52 【问题描述】:我正在使用 Laravel 和 Lighthouse 包。现在我正在尝试制作一个包含客户撰写的所有评论的列表页面。我可以获取分页评论并为其应用一些过滤器:
按评级 按客户国籍 等等目前的问题是,我需要按国籍和评分显示有多少评论。
示例:
按评分:
5 星 => 1000 条评论 4 星 => 455 条评论 3 星 => 205 条评论 2 星 => 87 条评论 1 开始 => 19 条评论按国籍
美国 => 340 条评论 法国 => 200 条评论 德国 => 450 条评论一个服务可以供多个客户使用,并且只能由主要客户留下评论。这就是客户未存储在评论表中的原因。客户至少取自三个嵌套关系。
数据库结构:
评论:
身份证 service_id 评分服务:
身份证 开始日期 结束日期客户服务:
service_id customer_id is_primary客户:
身份证 姓名 country_id国家:
身份证 姓名我想添加一个名为 ReviewCountByRating 和 ReviewCountByNationality 的新类型,其中包含将运行查询并获取信息的自定义解析器。类似于 Lighthouse 中的 PaginatorInfo。
这是我第一个使用 GraphQl 和 Lighthouse 的项目,但我找不到如何实现它的示例。
可能的解决方案
我还希望应用的所有过滤器和范围都对计数产生影响。所以我认为最好的解决方案是进行这样的查询:
reviews
data
id
rating
countBy(attribute: "rating")
attribute
count
countBy(attribute: "country.id")
id
count
尽管我希望它以这种方式工作,但我认为如果我们添加 @paginate 指令,这看起来不可能/很难实现。
我目前的解决方案
所以我认为最好有一个单独的查询,该查询将返回 CountById 或 CountByAttribute 的 graphQl 类型。以下是我在架构中描述它们的方式:
type CountById
id: ID
count: Int
type CountByAttribute
attribute: String
count: Int
我们将需要这两种类型,因为当我们按评级计算评论时,我们会按评级字段对它们进行分组/计算。但是当我们计算一个国家的评论时(在我的例子中,女巫是一个关系)会很好地通过关系的 id 而不是国家的名称对它们进行分组。 因此,我在 GraphQl 架构中添加了一个自定义查询,该查询将返回此信息。
type Query
....
reviewCountByRating: [CountByAttribute]
reviewCountByCountry: [CountById]
...
然后我运行这两个工匠命令来为添加的查询创建解析器:
php artisan lighthouse:query ReviewCountByRating
php artisan lighthouse:query ReviewCountByCountry
并在那里实现 cmets 的计数。
这是我目前的解决方案。很高兴知道其他人如何实现这一点。如果您认为此解决方案可以改进,请随时分享。
【问题讨论】:
您能否提供一个您希望运行并获得结果的查询示例? @AlirezaA2F 我用“可能的解决方案”和“我的当前解决方案”部分更新了问题。希望这个回答你的问题。 【参考方案1】:如果您想在分页器信息或旁边添加一个字段,我想您需要制作自己的指令,例如@customPaginate
。一种更简单的方法是在每一行中添加一个字段并在那里进行计数,但为了避免出现N+1
查询问题,我建议使用@withCount
。
【讨论】:
我不确定应该如何使用@withCount
。你能给我一些例子吗?
您的模型中需要有一个关系来返回相关模型的实例。这将有助于查看 @withCount
lighthouse-php.com/master/api-reference/directives.html 以查看示例以上是关于在 Laravel Lighthouse 中添加自定义类型和解析器的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel Lighthouse 在 Laravel 7 中出现 CORS 错误
变异中的 Laravel LightHouse GraphQL DateTime 输入始终为空
Laravel Lighthouse 配置 - 无法找到可发布的资源