我正在使用 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 扫描文本并返回配置文件所属的用户。