【问题标题】:Laravel Scout - Where not equal toLaravel Scout - 不等于
【发布时间】:2021-08-24 16:28:52
【问题描述】:

我正在为 Laravel Scout 构建一个查询。

$subchanResults = Subchan::search($query)
    ->when($request->input('incl_nsfw'), function ($query, $incl_nsfw) {
        if ($incl_nsfw == 0) {
            return $query->where('nsfw','!=', 'always');
        }
    }, function ($query) {
        return $query->where('nsfw','!=', 'always');
    })          

->paginate(3);

Laravel Scout 只允许基本的 where 子句,不允许任何高级条件子句,所以到目前为止它有点棘手。 (文档:https://laravel.com/docs/8.x/scout#where-clauses

我的问题在于这一行:return $query->where('nsfw','!=', 'always');

Scout 似乎允许使用简单的 where('column','value') ,但如果我尝试将第三个参数添加到 where 子句(不等于),它就不起作用了。

我怎样才能使这个查询工作?还是我必须在查询后自己手动修剪结果?

【问题讨论】:

    标签: laravel laravel-scout


    【解决方案1】:

    您链接解释的文档:

    Scout 允许您在搜索查询中添加简单的“where”子句。目前,这些子句仅支持基本的数字相等检查,主要用于按所有者 ID 确定搜索查询的范围。由于搜索索引不是关系数据库,因此目前不支持更高级的“where”子句

    基本上,当您调用 ::search 时,您不再构建 Eloquent ORM 查询;你正在构建一个 Scout 查询,而 Scout 查询的 where 方法只接受两个参数:一个键和一个要匹配的值:

    https://github.com/laravel/scout/blob/7a8d5b90761e0c102d357dd9e57d8c2f726ceaa5/src/Builder.php#L103-L110

    【讨论】:

      【解决方案2】:

      我希望在 Scout 本身中找到一种解决方法,但目前看来,条件子句对于 scout 来说是完全不可能的。这是我在搜索引擎级别(Meilisearch)针对同一场景进行过滤的解决方案:

      $subchanResults = Subchan::search($query, function ($meilisearch, $query, $options) use ($request) {
          if ($incl_nsfw = $request->input('incl_nsfw')) {
              $options['filters'] = 'nsfw != always';
          }   
      
          return $meilisearch->search($query, $options);
      })->get();
      

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 2018-10-26
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        • 2019-02-18
        • 2021-09-06
        • 1970-01-01
        相关资源
        最近更新 更多