我正在创建现有API的GraphQL实现。我正在将Laravel 5.8和Lighthouse 3.7一起使用。
我想知道如何使用此功能实现搜索功能-类似于...
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
}
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
这样的模型。我想知道什么是正确的方法。
答案 0 :(得分: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 method并将其扩展为一些constraints。
答案 1 :(得分:0)
我在整个项目中尝试过的最好方法是在 scopeSearch
模型中添加一个公共静态 User
函数并在那里执行搜索,然后轻松使用下面的代码进行搜索:
users(q: String @search): [User]
@paginate(model: "App\\Models\\User")
@search
将触发模型中的搜索功能。