Laravel Scout с TNT Поиск
Я использую 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();
Но я делал это для нескольких моделей, таких как: статья, событие и т. Д., Поэтому сценарий выглядел довольно раздутым.
Я выполнил необходимые шаги в документации и настроил Scout на использование поиска TNT с помощью предоставляемого ими пакета Laravel.
В документации Laravel говорится, что Scout не так хорош в продвинутых предложениях, поэтому, следуя документации немного дальше вниз по странице, я сделал что-то подобное в верхней части моего контроллера:
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 для поиска профиля, связанного с пользователем?
Я хочу иметь возможность вводить текст в поле, и Скаут сканирует текст и возвращает пользователя, которому принадлежит профиль.
1 ответ
Я предполагаю, что вы используете teamtnt / laravel-scout-tntsearch-driver? Если это так, то он еще не поддерживает функцию Scout mustBeSearchable.
Вот соответствующий тикет: https://github.com/teamtnt/laravel-scout-tntsearch-driver/issues/153