Реализация функциональности поиска в Laravel/Lighthouse GraphQL API
Я создаю реализацию GraphQL существующего API. Я использую Laravel 5.8 с Lighthouse 3.7.
Мне интересно, как реализовать функцию поиска с помощью этого - что-то вроде...
scheme.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
возвращается. Мне интересно, как правильно сделать это.
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 и расширяем его с некоторыми ограничениями.
Лучший способ, который я пробовал на протяжении всего своего проекта, - это добавить общедоступный статический
scopeSearch
функция в
User
модели и выполните поиск там, а затем легко используйте приведенный ниже код для поиска:
users(q: String @search): [User]
@paginate(model: "App\\Models\\User")
В
@search
вызовет функцию поиска в вашей модели.