如何在Laravel Lighthouse的@search指令中使用Meilisearch过滤器
解决Laravel Lighthouse @search指令添加Meilisearch过滤条件的问题
问题原因
你当前把搜索关键词和过滤条件混杂在同一个search参数里,不符合Lighthouse @search指令的设计逻辑——该指令默认仅处理搜索关键词,无法识别字符串中嵌套的过滤规则。
解决方案
1. 修改GraphQL查询定义
新增独立的filter参数,专门用于传递过滤条件:
type Query { movies(search: String @search, filter: String): [Movie!]! @paginate }
2. 在模型中扩展Scout搜索逻辑
重写Movie模型的search方法,读取filter参数并将其应用到Meilisearch查询:
use Laravel\Scout\Searchable; class Movie extends Model { use Searchable; public static function search($query, $callback = null) { // 初始化Scout搜索构建器 $searchBuilder = parent::search($query, $callback); // 获取GraphQL请求中的filter参数 $filterCondition = request()->input('filter'); // 若存在过滤条件,直接传递给Meilisearch if ($filterCondition) { $searchBuilder->filter($filterCondition); } return $searchBuilder; } }
3. 发起正确的GraphQL查询
使用分离的变量分别传递搜索关键词和过滤条件:
query FetchMovies($search: String, $filter: String) { movies(search: $search, filter: $filter) { id title release_date # 按需添加其他返回字段 } }
对应的查询变量:
{ "search": "Avengers", "filter": "release_date > 795484800" }
验证说明
该方案的逻辑和你之前成功调用的Curl请求完全对齐,会将filter参数直接映射到Meilisearch的filter查询项,确保过滤规则生效。
内容的提问来源于stack exchange,提问作者grimdbx
相关产品推荐
相关产品推荐

