Как создать оператор запроса для функции фильтра поиска Laravel? - PullRequest
1 голос
/ 28 мая 2019

Как создать оператор запроса для функции фильтра поиска Laravel? Я хотел бы объединить поисковый запрос Laravel в один. Теперь есть проблема с этим кодом. Это не мультиусловие суперпозиции. Я хочу объединить этот запрос в один и получить результаты, которые удовлетворяют всем условиям. Что мне делать?

//펜팔 메인 페이지
public function index (Request $request){
    //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 name search
     if (!empty($request->goal) && $request->goal !== 'all') {

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


    //age search
    if($request->ageMin || $request->ageMax){

        $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]);
    }




    $penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12);




    $penpalsCount = count($penpalsData);

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

}

1 Ответ

0 голосов
/ 28 мая 2019

Вы должны добавить отношение user к модели по переписке.

class Penpal extends Model {
    ...

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    ...
}

Тогда вы можете использовать whereHas красноречивый метод:

public function index (Request $request){
    //query builder
    $query =  $this->penpalModel->query();

    //user fields
    if(
        $request->name || 
        $request->ageMin ||
        $request->ageMax ||
        ($request->gender && $request->gender !== 'all') ||
        ($request->country && $request->country !== 'all')
    ){
        $query->whereHas('user', function($query) use ($request){
            if($request->name){
                $query->where('name', 'like', '%' . $request->name . '%');
            }

            if($request->gender && $request->gender !== 'all'){
                $query->where('gender', $request->gender);
            }

            if($request->country && $request->country !== 'all'){
                $query->where('country', $request->country);
            }

            if($request->ageMin){
                $query->where('age', '>', floor($request->ageMin));
            }

            if($request->ageMax){
                $query->where('age', '<', floor($request->ageMax));
            }
        })
    }

    //goal
    if ($request->goal && $request->goal !== 'all') {
        $query->where('goal_id', $request->goal);
    }

    $penpals = $query
        ->with('user')
        ->latest()
        ->paginate(12);

    return view('penpal.index')->with([
        'penpals'       => $penpals,
        'penpalsCount'  => $penpals->count() //use $query->count() to get count of all results in db, not only in paginator collection
    ]);
}

К сожалению, это решение не является 100% копией вашего кода / идеи, потому что оно теряет выбор, но фильтрация будет работать правильно, и вы можете получить доступ к пользователю каждого друга по переписке, например так:

$penpal->user->name //in php

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