Реализация функциональности поиска в Laravel / Lighthouse GraphQL API - PullRequest
2 голосов
/ 22 июня 2019

Я создаю реализацию GraphQL для существующего API.Я использую 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
}

UserSearch.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"

Я знаю, что идет не так - $users в функции resolve возвращает интерактивный объект - а не модель - как hasMany или belongsTo возвращается.Мне интересно, как правильно это сделать.

1 Ответ

2 голосов
/ 26 июня 2019

То, что вы пытаетесь сделать, должно быть возможно без использования специального распознавателя.

Вы должны быть в состоянии сделать это с чем-то подобным следующему

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 и расширить его с некоторыми ограничениями .

...