Laravel / Lighthouse GraphQL-如何通过子弹属性查找?

问题描述

我正在为Nuxt应用程序创建Laravel后端,并且正在使用Lighthouse-PHP通过GraphQL传递数据。

我正在尝试设置查询以通过Slug(而不是默认ID)进行查找。当我在graphql操场上运行查询时,它会正确返回数据,但是当我在前端加载页面时,它会返回null

后端

schema.graphql

type Query {
  forumCategoryBySlug(slug: String! @eq): ForumCategory @find
}

type ForumCategory {
  id: ID!
  title: String!
  description: String!
  slug: String!
  subcategories: [ForumSubcategory!]! @hasMany
  created_at: DateTime!
  updated_at: DateTime!
}

ForumCategory.php模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class ForumCategory extends Model
{
    protected $fillable = [
        'title','description','slug'
    ];

    public function subcategories(): HasMany
    {
        return $this->hasMany(ForumSubcategory::class);
    }
}

前端

Index.vue

import categoryQuery from '~/apollo/queries/forum/category.gql';
export default {
  apollo: {
    category: {
      prefetch: false,fetchPolicy: 'network-only',query: categoryQuery,variables () {
        return {
          slug: this.$route.params.slug
        };
      }
    }
  },}

category.gql

query Category($slug: String!) {
  category: forumCategoryBySlug(slug: $slug) {
    id
    title
    description
    slug
  }
}

我觉得我已经仔细检查了所有小事情,但是我一生都无法弄清楚为什么数据仍然返回null。任何帮助将不胜感激!

解决方法

几天后想通了。基本上,我需要创建一个自定义解析器。

schema.graphql

type Query {
  forumCategoryBySlug(slug: String! @eq): ForumCategory
}

app / GraphQL / Queries / ForumCategoryBySlug.php

<?php

namespace App\GraphQL\Queries;
use App\Models\ForumCategory;

class ForumCategoryBySlug
{
    /**
     * @param  null  $_
     * @param  array<string,mixed>  $args
     */
    public function __invoke($_,array $args)
    {
        $category = \App\Models\ForumCategory::findBySlug($args["slug"])->first();
        return $category;
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...