Я использую 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();
Я делал это для нескольких моделей, которые у меня есть, таких как Article, Event и т. Д., И в итоге сценарий получился раздутым. Я выполнил необходимые шаги в документации и настроил Laravel Scout для использования TNTSearch, используя предоставленный ими пакет Laravel.
В документации Laravel говорится, что Laravel Scout не так хорош в продвинутых предложениях where, поэтому, следуя документации немного дальше по странице, я сделал что-то подобное в верхней части своего контроллера.
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 сканировать текст и возвращать пользователя, которому принадлежит профиль.