3

我正在创建现有 API 的 GraphQL 实现。我正在使用 Laravel 5.8 和 Lighthouse 3.7。

我想知道如何使用它来实现搜索功能 - 类似于......

方案.graphql

type Query {
    userSearch(name: String, email: String, phone: String, city_id: Int): [User] #Custom Resolver - app/GraphQL/Queries/UserSearch.php
}
type User {
    id: ID!
    name: String!
    email: String
    phone: String
    credit: Int
    city_id: Int
    city: City @belongsTo
}

用户搜索.php

public function resolve($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
{
    $q = app('db')->table('users');
    foreach($args as $key => $value) {
        $q->where($key, $value);
    }
    $users = $q->get();

    return $users;
}

这将起作用 - 但仅适用于查询返回的字段。

{
    userSearch(name:"Picard") {
        id          # This will work
        name        # This will work
        city {      # These wont.
            id      # These won't work
            name    # These won't work
        }
    }
}

我尝试时会收到此错误...

"debugMessage": "Argument 1 passed to Nuwave\\Lighthouse\\Schema\\Directives\\RelationDirective::Nuwave\\Lighthouse\\Schema\\Directives\\{closure}() must be an instance of Illuminate\\Database\\Eloquent\\Model, instance of stdClass given, called in /mnt/x/Data/www/Projects/Phoenix/vendor/nuwave/lighthouse/src/Schema/Factories/FieldFactory.php on line 221"

我知道出了什么问题——函数$usersresolve的返回的是一个可交互的对象——而不是一个模型——比如hasManybelongsTo返回。我想知道这样做的正确方法是什么。

4

2 回答 2

2

您尝试做的事情应该可以在不使用自定义解析器的情况下进行。

您应该能够使用以下类似的东西来做到这一点

type Query {
    userSearch(name: String @eq, email: String @eq, phone: String @eq, city_id: Int @eq): [User] @paginate
}
type User {
    id: ID!
    name: String!
    email: String
    phone: String
    credit: Int
    city_id: Int
    city: City @belongsTo
}

在这里,我们利用paginate 方法并使用一些约束对其进行扩展。

于 2019-06-25T21:27:56.130 回答
0

我在整个项目中尝试过的最好方法是scopeSearch在模型中添加一个公共静态函数User并在那里执行搜索,然后轻松使用下面的代码进行搜索:

users(q: String @search): [User]
@paginate(model: "App\\Models\\User")

@search将触发模型中的搜索功能。

于 2021-06-18T09:34:17.990 回答