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

Другие вопросы по тегам