В приложении, над которым я работаю, есть два основных поиска: поиск по всему сайту и быстрый поиск.
Быстрый поиск
Быстрый поиск должен занять роль, пользователя и отдел и вернуть всех пользователей, которые соответствуют критериям. Я уже вижу потенциальную проблему в том, что вы можете выбрать роль, которой нет в отделе ... но все равно.
Это то, что я пробовал.
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);
}