与TNTSearch的Laravel Scout

时间:2018-05-16 12:44:28

标签: php laravel laravel-5 laravel-scout

我正在使用Laravel Scout来替换我的搜索功能,因为它之前是一个类似于下面的大型SQL LIKE语句。

$users = User::where('username', 'like', '%'.$request->get('q').'%')
    ->orWhere('displayName', 'like', '%'.$request->get('q').'%')
    ->orWhere('email', 'like', '%'.$request->get('q').'%')
    ->orWhere('role', 'like', '%'.$request->get('q').'%')
    ->orWhere('department', 'like', '%'.$request->get('q').'%')
    ->orWhere('location', 'like', '%'.$request->get('q').'%')
    ->orWhere('directDialIn', 'like', '%'.$request->get('q').'%')
    ->orWhere('mobileNumber', 'like', '%'.$request->get('q').'%')
    ->get();

我正在为包含文章,事件等的多个模型执行此操作,并且脚本最终变得臃肿。我按照文档中的必要步骤设置了Laravel Scout,使用他们提供的Laravel包来使用TNTSearch。

在Laravel文档中说Laravel Scout在高级where子句中并不是那么擅长,所以在文档后面的文档中,我在Controller的顶部做了类似的事情。

use Searchable;

public function shouldBeSearchable()
{
    return $this->published === "open";
}

/**
 * Get the indexable data array for the model.
 *
 * @return array
 */
public function toSearchableArray()
{
    $array = $this->toArray();

    // Customize array...

    return $array;
}

它应该只返回在我的数据库表中发布等于'open'的模型(或者我认为)。但是,我运行以下命令:

php artisan scout:import "App\Article"

然后执行搜索,它仍然返回已关闭的文章。我想通过定义shouldBeSearchable它会阻止这个吗?

此外,是否可以在执行Scout搜索时索引模型上的关系?例如,如果用户有个人资料,我可以使用Scout搜索与用户相关的个人资料吗?我希望能够在框中键入文本,并让Scout扫描文本并返回配置文件所属的用户。

1 个答案:

答案 0 :(得分:2)

我假设您正在使用teamtnt / laravel-scout-tntsearch-driver?如果是这样,它还不支持Scout的shouldBeSearchable函数。

以下是相关问题单:https://github.com/teamtnt/laravel-scout-tntsearch-driver/issues/153