Построение динамических запросов в Laravel — как выполнить поиск с несколькими вариантами

Итак, я пытаюсь настроить страницу поиска, и она имеет несколько опций get. Но мне любопытно, как правильно это настроить, я знаю, что это далеко не так, как я делаю, если операторы внутри установки переменной, но я Я так потерян прямо сейчас.

Любая помощь будет принята с благодарностью.

public function index()
{

$queryUsername = Request::get('u');
$queryPostcode = Request::get('p');
$queryOrderbyPhotos = Request::get('o1');
$queryOrderbyOnline = Request::get('o2');
$queryOrderbyTypes = Request::get('o3');

$users = User::rightJoin('user_profiles','users.id', '=', 'user_profiles.user_id')

if ($queryUsername)
{
->where('users.username', '=', "$queryUsername")
}
if ($queryPostcode) {
->where('user_profiles.postcode', '=', "$queryPostcode")
}
if ($queryOrderbyPhotos) {
->whereNotNull('user_profile.avatar')
}
if ($queryOrderbyOnline) {
->orderBy('users.last_online', 'DESC')
}
if ($queryOrderbyType) {
->orderBy('users.type', 'DESC')
}
->get();

return view('view', compact('users'));
}

1

Решение

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

С Eloquent и фактически с любым классом, который позволяет Метод цепочки вы можете сделать это:

$query = User::select(...)->join(..);
$query->where(...);
$query->get(...);

Так что в вашем случае я буду пытаться добиться того, что вы хотите, таким образом:

   public function index()
{
$input = Request::all();

$query = User::rightJoin('user_profiles', 'users.id', '=', 'user_profiles.user_id');

if (isset($input['u']) && $input['u'])
$query->where('users.username', '=', $input['u']);

if (isset($input['p'])  && $input['p'])
$query->where('user_profiles.postcode', '=', $input ['p']);

if (isset($input['o1']) && $input['o1'])
$query->whereNotNull('user_profile.avatar');

if (isset($input['o2']) && $input['o2'])
$query->orderBy('users.last_online', 'DESC');

if (isset($input ['o3']) && $input['o3'])
$query->orderBy('users.type', 'DESC');

$users = $query->get();

return view('view', compact('users'));
}

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

Кстати, я предлагаю перенести весь этот код в вашу модель или в отдельный класс, так как я предпочитаю держать контроллеры тонкими.

3

Другие решения

Ты можешь попробовать :

$users_query = new User;
$users_query->rightJoin(....);

if ($queryUsername)
{
$users_query->where('users.username', '=', "$queryUsername")
}
// Your other conditions .....
....

$users = $users_query->get();
1

По вопросам рекламы [email protected]