Как правильно иметь страницу поиска с несколькими фильтрами? - PullRequest
0 голосов
/ 19 мая 2018

Я с некоторыми сомнениями о том, как создать страницу поиска, как показано ниже, где пользователь может искать конгрессы, используя несколько фильтров (категория, город, цена, дата) и разбиение на страницы.Итак, у меня есть страница search.blade.php, например:

enter image description here

На данный момент я создал SearchController, который возвращает конгрессы, города и категориидля просмотра search.blade.php:

class SearchController extends Controller
{
    public function index(){
        $pageLimit = 1;
        return view('search')
            ->with('categories', Category::orderBy('created_at', 'desc')->get())
            ->with('cities', Congress::orderBy('created_at','desc')->pluck("city")->unique())
            ->with('congresses', Congress::orderBy('created_at','desc')->paginate($pageLimit));
    }
}

Так что в search.blade.php есть это меню выбора:

<div class="row">
    <div class="col-6 col-md-3 mb-4 mb-md-0">
        <form>
            <select class="custom-select form-control">
                <option selected="">All categories </option>
                @foreach ($categories as $category)
                    <option {value="{{ $category->id }}">
                        {{ $category->name }}
                    </option>
                @endforeach
            </select>
        </form>
    </div>

    <div class="col-6 col-md-3 mb-4 mb-md-0">
        <form>
            <select class="custom-select form-control">
                <option selected="">All cities</option>
                @foreach($cities as $city)
                    <option>
                        {{ $city }}
                    </option>
                @endforeach
            </select>
        </form>
    </div>

    <div class="col-6 col-md-3">
        <form>
            <select class="custom-select form-contro">
                <option selected="">Price</option>
                <option>Paid</option>
                <option>Free</option>
            </select>
        </form>
    </div>

    <div class="col-6 col-md-3">
        <form>
            <select class="custom-select form-control">
                <option selected="">This week</option>
                <option>This month</option>
            </select>
        </form>
    </div>
</div>

И в search.blade.php появляются такжепо умолчанию последние 8 вставленных конгрессов:

<div class="row">
    @foreach($congresses as $congress)
        <div class="col-12 col-sm-6 col-lg-4 col-xl-3 my-4">
            <div class="card">
                <img class="card-img-top" src="{{$congress->image}}" alt="Card image cap">
                <div class="card-body">
                    <p class="font-size-sm">{{$congress->start_date}}</p>
                    <h5 class="card-title">{{$congress->name}}</h5>
                </div>
            </div>
        </div>
    @endforeach
</div>
<div class="text-center d-flex justify-content-center mt-3">
    {{$congresses->links("pagination::bootstrap-4")}}
</div>

Знаете ли вы, как необходимо, чтобы этот контекст мог быть правильно достигнут?

Ответы [ 2 ]

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

Попробуйте это ..

search.blade.php

<div class="row">
    <form action="{{ route('your.index') }}" method="get">
        <div class="col-6 col-md-3 mb-4 mb-md-0">
            <select class="custom-select form-control" name="category_id">
                <option selected="" value="">All categories </option>
                @foreach ($categories as $category)
                    <option value="{{ $category->id }}" {{ (!empty($categoryId) && $categoryId == $category->id) ? 'selected' : '' }}>
                        {{ $category->name }}
                    </option>
                @endforeach
            </select>
        </div>

        <div class="col-6 col-md-3 mb-4 mb-md-0">
            <select class="custom-select form-control" name="city">
                <option selected="" value="">All cities</option>
                @foreach($cities as $city)
                    <option value="{{ $city }}" {{ (!empty($selectedCity) && $selectedCity == $city) ? 'selected' : '' }}>
                        {{ $city }}
                    </option>
                @endforeach
            </select>
        </div>

        <div class="col-6 col-md-3">
            <select class="custom-select form-contro" name="price">
                <option {{ empty($price) ? 'selected' : '' }} value="">Price</option>
                <option value="paid" {{ (!empty($price) && $price == 'paid') ? 'selected' : '' }}>Paid</option>
                <option value="free" {{ (!empty($price) && $price == 'free') ? 'selected' : '' }}>Free</option>
            </select>
        </div>

        <div class="col-6 col-md-3">
            <select class="custom-select form-control" name="range">
                <option value="week" {{ (!empty($range) && $range == 'week') ? 'selected' : '' }}>This week</option>
                <option  value="month" {{ (!empty($range) && $range == 'month') ? 'selected' : '' }}>This month</option>
            </select>
        </div>

Поиск

Контроллер

class SearchController extends Controller
{
    public function index(Request $request){
        $categoryId = $request->get('category_id');
        $city       = $request->get('city');
        $price      = $request->get('price');
        $range      = $request->get('range');
        $pageLimit  = 1;

        $congress = Congress::Query();

        if(!empty($categoryId)) {
            //$congress = $congress->where('category_id', $categoryId)
            $congress = $congress->whereHas('categories', function($qry) use($categoryId) {
                $qry->where('category_id', categoryId);
            });
        }

        if(!empty($city)) {
            $congress = $congress->where('city', $city)
        }

        if(!empty($price)) {
            if($price == "free") { 
                $congress = $congress->whereHas('ticketTypes', function($qry) { 
                    $qry->where('price', '=', 0); 
                }); 
            } elseif($price == "paid") { 
                $congress = $congress->whereHas('ticketTypes', function($qry) { 
                    $qry->where('price', '>', 0); 
               }); 
           } 
        }

        if(!empty($range)) {
            if($range == "week") {
                 $congress = $congress->where('start_date', '<', Carbon::now()->addDays(7));
            } elseif($range == "month") {
                 $congress = $congress->where('start_date', '<', <arbon::now()->addDays(30));
            }
        }

        $congress = $congress->orderBy('created_at','desc')->paginate($pageLimit);

        return view('search', [
            'categories'     => Category::orderBy('created_at', 'desc')->get(),
            'cities'         => Congress::orderBy('created_at','desc')->pluck("city")->unique(),
            'congresses'     => $congress,
            'categoryId'     => $categoryId,
            'selectedCity'   => $city,
            'price'          => $price,
            'range'          => $range,
        ];
    }
}

Вы можете настроить это в соответствии с вашими реальными требованиями и реальными переменными.

Для разбивки результатов с помощью параметров фильтра используйте ссылки на страницы, как показано ниже:

<div class="text-center d-flex justify-content-center mt-3">
    {{$congresses->appends(Request::all())->links("pagination::bootstrap-4")}}
</div>

Hopeэто помогает .. Дайте мне знать результаты ..

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

используйте построитель запросов и объединяйте каждое свойство, которое вы хотите связать в поиске.

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