1

我正在使用 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;
}

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

php artisan scout:import "App\Article"

然后执行搜索,它仍然返回关闭的文章。我认为通过定义shouldBeSearchable它可以防止这种情况发生?

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

4

1 回答 1

2

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

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

于 2018-05-16T13:17:50.900 回答