【问题标题】:Laravel/ Lighthouse GraphQL - how to find by slug attribute?Laravel/ Lighthouse GraphQL - 如何通过 slug 属性查找?
【发布时间】:2021-02-18 17:13:04
【问题描述】:

我正在为 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。任何帮助将不胜感激!

【问题讨论】:

  • 比较网络请求(使用 graphiql/playground)、正文(变量的值是否正确传递?)、标头、... auth/ACL 原因?
  • 我实际上只是在这样做,它们似乎是相同的。我现在正在创建一个自定义解析器 (lighthouse-php.com/3.1/the-basics/fields.html#resolving-fields)
  • 尝试在邮递员中重新创建请求
  • 那里看起来一切都很好。我不确定为什么它在 Playground 而不是在应用程序中工作,但我觉得这与需要创建自定义 Lighthouse 解析器有关。
  • 不是,如果它在操场上工作,肯定不是解析器级别(仍然是“外部”,来自 FE 调用)...中间件/身份验证/其他原因,请检查详细的标题/cors/身份验证跨度>

标签: laravel graphql nuxt.js vue-apollo laravel-lighthouse


【解决方案1】:

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

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;
    }
}

【讨论】:

  • 不确定我是否关注,但这样的事情就足够了schoolByCode(code: String! @eq): School @first
猜你喜欢
  • 2020-06-19
  • 2021-10-22
  • 1970-01-01
  • 2019-11-28
  • 2022-11-11
  • 2021-12-07
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多