我正在使用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扫描文本并返回配置文件所属的用户。
答案 0 :(得分:2)
我假设您正在使用teamtnt / laravel-scout-tntsearch-driver?如果是这样,它还不支持Scout的shouldBeSearchable函数。
以下是相关问题单:https://github.com/teamtnt/laravel-scout-tntsearch-driver/issues/153