Laravel 5.6 формы поиска - PullRequest
0 голосов
/ 02 мая 2018

В приложении, над которым я работаю, есть два основных поиска: поиск по всему сайту и быстрый поиск.

Быстрый поиск

Быстрый поиск должен занять роль, пользователя и отдел и вернуть всех пользователей, которые соответствуют критериям. Я уже вижу потенциальную проблему в том, что вы можете выбрать роль, которой нет в отделе ... но все равно.

Это то, что я пробовал.

public function userSearch(Request $request)
{
    $department = $request->get('department');
    $role = $request->get('role');
    $location = $request->get('location');

    $users = User::where('department', $department)
                    ->where('role', $role)
                    ->where('location', $location)
                    ->get();

    foreach($users as $user)
    {
        echo '<br />' . $user->username;
    }

}

Это усложняется, хотя пользователь, роль и отдел являются раскрывающимися списками и, возможно, ничего не выбрали.

Так что, если я ищу только Digital как отдел, строка запроса:

http://127.0.0.1:8000/usersearch?department=Digital&role=&location=

Очевидно, это ничего не возвращает, так как я использую несколько выражений where.

Должен ли я отдельно проверить, пуста ли каждая переменная, и построить запрос? Это кажется немного отрывочным, так как мне нужно проверить каждый возможный заказ, чтобы получить правильный запрос.

Поиск по сайту

Другой поиск - это поиск по сайту, который берет одну строку запроса, вот мой тупо базовый метод:

public function search(Request $request)
{
    $search = $request->get('q');

    return view('pages.search.index', compact('search'));

}

Я прочитал в документации Laravel, что есть пакет под названием Scout, но есть ли более простой способ получить все из каждой модели, учитывая строку запроса?

Вещи, которые я хотел бы вернуть:

  • Пользователи
  • Команда
  • Документы с похожими названиями
  • Новостные статьи

У меня есть модели, связанные с таблицами базы данных для всего вышеперечисленного, так что я могу просто сделать следующее?

users = User::where('name', 'like', '%' . Input::get('name') . '%')
              ->orWhere('name', 'like', '%' . Input::get('name') . '%')

articles= Article::where('name', 'like', '%' . Input::get('name') . '%')
                  ->orWhere('name', 'like', '%' . Input::get('name') . '%')

и так далее ...

Затем при отображении результатов просто выполните:

return('nameofview', compact('users', 'articles')

Или это может быть медленно и громоздко?

Обновление

Для поиска по всему сайту, сейчас у меня просто есть:

public function search(Request $request)
{
    $search = $request->get('q');

    $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();


    return view('pages.search.index', compact('search', 'users'));

}

Для быстрого поиска я добавил несколько областей запроса

/**
 * Scope a query by department
 */
public function scopeByDepartment($query, $department)
{
    return $query->where('department', $department);
}

/**
 * Scope a query by role
 */
public function scopeByRole($query, $role)
{
    return $query->where('role', $role);
}

/**
 * Scope a query by location
 */
public function scopeByLocation($query, $location)
{
    return $query->where('location', $location);
}

1 Ответ

0 голосов
/ 02 мая 2018

Существует гораздо лучший способ достичь того, что вы хотите сделать, используя комбинацию условных предложений и областей действия. Например ...

User::all()->when(isset($request->department), function ($q) use ($request) {
    $q->byDepartment($request->department);
})
->when(isset($request->role), function($q) use ($request) {
    $q->byRole($request->role);
});

После того, как вы настроили свои области действия на модели, теперь вы можете выборочно фильтровать по любому числу переменных запроса, чтобы вам не приходилось беспокоиться, если он не установлен. Это также делает ваш код намного более компактным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...