如何在Laravel Scout中正确使用whereNot查询方法
原因
Laravel Scout 的搜索查询构建器未原生实现whereNot方法,你调用的该方法不会被解析为对应搜索引擎的负向过滤规则,因此这部分过滤逻辑直接被忽略,不会生效。
可用解决方案
方案1:使用whereNotIn方法(适配Scout 9.x及以上版本,支持负向过滤的驱动:Meilisearch、Algolia、Elasticsearch等)
将需要排除的id放入数组,调用Scout原生支持的whereNotIn方法实现负向过滤:
Address::search("{$address->suburb}") ->whereNotIn('id', [$address->id]) ->get();
方案2:搜索结果集合过滤(适配所有驱动,小数据量场景适用)
如果所用驱动不支持服务端负向过滤,或者搜索结果量级很小,可以先拉取全量搜索结果,再在Laravel集合层面做排除:
Address::search("{$address->suburb}") ->get() ->where('id', '!=', $address->id);
方案3:自定义引擎查询回调(高级场景适用)
如果需要自定义过滤逻辑,可直接通过搜索回调修改引擎侧的查询参数,以Meilisearch为例:
Address::search("{$address->suburb}", function ($engine, string $query, array $options) use ($address) { $options['filter'][] = "id != {$address->id}"; return $engine->search($query, $options); })->get();
内容的提问来源于stack exchange,提问作者Bilal Arshad
相关产品推荐
相关产品推荐

