Как я могу фильтровать по условию поискового запроса в Laravel?

Каждое из них создало код для фильтрации поисковых запросов по полу, национальности, цели и возрасту, но все эти приложения работают отдельно. Я хочу сделать это результатом. Я хотел бы знать, как реагировать на различные условия одновременно. Например, если пол и возраст слышны сразу, я должен вернуть результаты по нему, и я хочу знать, как это сделать. Здесь я хочу решить две вещи. 1.Применить наложение условия ко всем результатам поиска 2.При входе на страницу без поиска не печатался список

//base Object
    $penpals =  $this->penpalModel->getUsers();


    //name search
    if (!empty($request->name)) {
        $users = $this->userModel->where('name', 'like', '%' . $request->name . '%')->get();
        if (!empty($users)) {

            $penpals->whereIn('user_id', $users);
        }        
    }


    //gender search
    if (!empty($request->gender) && $request->gender !== 'all') { 
        $penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
        ->select('penpals.*', 'users.gender')
        ->where('users.gender', $request->gender); 
    }


    // country search
    if (!empty($request->country) && $request->country !== 'all') { 
    $penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
    ->select('penpals.*', 'users.country')
    ->where('users.country', $request->country); 
    }


     // goal search
     if (!empty($request->goal) && $request->goal !== 'all') {

        $penpals = $this->penpalModel->where('goal_id',$request->goal)->latest();
     }


    //age search
    if ($request->ageMin != 1 || $request->ageMax != 100 ){

        $ageMin = floor($request->ageMin);
        $ageMax = floor($request->ageMax);

        $penpals = $this->penpalModel->leftJoin('users', 'penpals.user_id', '=', 'users.id')
        ->select('penpals.*', 'users.age')
        ->whereBetween('users.age', [$ageMin, $ageMax])
        ->orderBy('penpals.created_at','desc');

    }


    //search result
    $penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12); 
$penpalsCount = count($penpalsData);

    return view('penpal.index')->with([
        'penpals'       => $penpalsData,
        'penpalsCount'  => $penpalsCount
        ]);
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что бы я сделал, так это построил бы объект по мере того, как вы проходите через поисковые фильтры.

Что вы делаете в настоящее время, так это применяете фильтр и резко завершаете его для каждого.

Сначала примените каждый имеющийся фильтр, а в конце выполните поиск.

Делай так:

add filter (age).
add filter (nationality).
-> then finally execute search.

Нет:

filter (age) -> search. execute.
filter (nationality) -> search. execute.

Вот идея (конечно, это не проверено):

<?php


// $penpals =  $this->penpalModel->getUsers()->latest()->paginate(12);
// base penpals object
$penpals = $this->penpalModel;
// start out with the initial original object, untouched

// if nickname is present, add filter nickname
if (!empty($request->name)) {
    $users = $this->userModel->where('name', 'like', '%' . $request->name . '%')->get();
    if (!empty($users)) {
        // apply | attached user ids found
        $penpals->whereIn('user_id', $users);
    }        
}
// dont cut off the query and execute yet, continually check other filters
if (!empty($request->gender) && $request->gender !== 'all') { 
    $penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
    ->select('penpals.*', 'users.gender')
    ->where('users.gender', $request->gender); 
}
// again, continue to the next set of filters (country search)
// and so on, the same syntax, build off of the base object and continually connect filters

// then on the end, EXECUTE it!

$penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12); // execute then builder after several layers of filters are applied!
$penpalsCount = count($penpalsData);


return view('penpal.index')->with([
    'penpals'       => $penpalsData,
    'penpalsCount'  => $penpalsCount
]);

Просто следуйте этой идее или концепции, это не ваша копия ответа и тип работы. Измените его и подгоните под свою бизнес-логику.

@박보근привет, удалите письмо выше, его конфиденциальные данные, ошибка не уникальна, означает, что вы получаете то же имя, используйте псевдоним users a u и penpals as p, чтобы избежать этого

Kevin 29.05.2019 03:08

Я решил это с помощью функции whereHas(). Спасибо за совет

박보근 29.05.2019 03:30

@박보근 хорошо, я понимаю, кстати, пожалуйста, удалите комментарий выше с данными образца электронной почты. если это исходит от данных ваших клиентов, то это конфиденциально

Kevin 29.05.2019 04:36

Не волнуйтесь, это просто фиктивные данные. Я студент и это мое хобби. Спасибо.

박보근 29.05.2019 05:12

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