在基于查询构建器的结果上调用searchable()会引发错误

时间:2017-12-28 12:07:13

标签: php laravel laravel-5 laravel-5.5 laravel-scout

如何对查询构建器返回的结果使用searcable()方法?假设有五个表:

  1. 产品
  2. 厂商
  3. 类别
  4. vendor_products(产品和供应商的数据透视表)
  5. product_categories(产品和类别的数据透视表)
  6. 有没有办法在以下查询中使用搜索:

       return \DB::table("products")
          ->join('vendor_products', function ($join) {
              $join->on('products.id', '=', 'vendor_products.product_id')
                   ->MANY_OTHER_WHERE_CONDITIONS
          })
          ->join('categories', function ($join) {
              $join->on('category_id', '=', 'categories.id');
          })
          ->MANY_OTHER_CONDITIONS
          ->searchable()
    

    但是Laravel Scout返回错误:

    Call to undefined method Illuminate\Database\Query\Builder::searchable()  
    

    有没有办法上传上述查询的结果? 我在供应商,类别和产品模型上添加了可靠性特征。

    看起来Scout仅在我们从查询返回Eloquent关系时才起作用,并且不适用于查询构建器。

2 个答案:

答案 0 :(得分:1)

根据Laravel Documentation

  

Laravel Scout提供了一个基于驱动程序的简单解决方案,用于向 Eloquent models 添加全文搜索。

“查询”构建器没有此功能。

相反,您可以实现的非常有用的解决方案是使用WHERE LIKE比较每一列。假设功能比Laravel Scope更慢,但如果您不想使用Eloquent,则可以执行此操作。

我的推荐是使用Eloquent。使用laravel

时,使用数据库是一种更快捷,更简单的方法

答案 1 :(得分:1)

问题已解决,所有功劳归于@kfirba。从他的blog

复制他的回复
  

searchable()方法仅适用于Eloquent的查询构建器。尝试将上面的查询转换为使用Eloquent。将DB :: table('products') - > join ...更改为Products :: join ...

     

您可能需要更改“toSearchableArray()”方法实现,以包含不属于产品型号的新字段(vendor_quantity,vendor_price等)