简体   繁体   中英

Adding orderBy is removing my filters

With category_parent applied in the filter it brings the results down to 13 from 242.

But as soon as I add in the order by it takes the results back to the full amount:

http://www.bristolfolkhouse.co.uk/results?keyword=&category_parent=6&course_week=&month=&category_child=&day=&time_of_day=&tutor=&order_by=asc

My results method can be found here: http://pastebin.com/G46vGRmu

Here is my search form partial: http://pastebin.com/2yaababn

I cannot understand why - Can anyone help?

Code:

public function results(Request $request){
    // dd($request->all());
    $courses = Course::select(['*']);
    // if only parent category
    if($request->has('category_parent') AND !$request->has('category_child'))
    {
        $parent_category[] = (integer) $request->get('category_parent');
        $child_categories = Category::where('parent_id', $request->get('category_parent'))->lists('id')->toArray();
        $all_categories = array_merge($parent_category, $child_categories);
        $courses = $courses->whereHas('categories', function ($query) use ($all_categories) {
            $query->where(function ($query) use ($all_categories) {
                foreach ($all_categories as $category) $query->orWhere('category_id', '=', $category);
            });
        });

        // else with child category
    } elseif($request->has('category_parent') AND $request->has('category_child')) {
        $courses = $courses->whereHas('categories', function ($query) use ($request) {
            $query->where('category_id', '=', $request->get('category_child'));
        });
    }

    if($request->has('course_week')) {
        $courses = $courses->where('course_weeks', $request->get('course_week'));
    }

    // if set start date
    if($request->has('start_date')) {
        $start_date_begin = substr($request->get('start_date'), 0, 10);
        $start_date_finish = substr($request->get('start_date'), -10);
        if(preg_match("/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/", $start_date_begin) AND preg_match("/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/", $start_date_finish)) {
            $carbon_begin =  Carbon::createFromFormat('d/m/Y', $start_date_begin);
            $carbon_finish =  Carbon::createFromFormat('d/m/Y', $start_date_finish);
            $courses = $courses->where('start_date', '>=', $carbon_begin->startOfDay());
            $courses = $courses->where('start_date', '<=', $carbon_finish->endOfDay());
        }
    }
    if($request->has('month')){
        $month      =   $request->get('month');
        /* $courses =   $courses->whereRaw('extract(month from start_date) = ?', [$month]); */
        $courses    =   $courses->whereMonth('start_date', '=', $month);
    }
    /* $courses =   $courses->paginate(10);
    echo "<pre>";print_r($courses);die; */

    if($request->has('tutor')) {
        $courses = $courses->where('tutor_id', $request->get('tutor'));
    }

    if($request->has('day')) {
        $courses = $courses->where('course_day', $request->get('day'));
    }

    //time_of_day
    if($request->has('time_of_day')) {
        //start_date_time
        if($request->get('time_of_day') == 'am') {
            $courses = $courses->whereBetween(DB::raw('TIME(`start_date`)'), ['00:00:01', '16:59:59']);
        } elseif($request->get('time_of_day') == 'pm') {
            $courses = $courses->whereBetween(DB::raw('TIME(`start_date`)'), ['17:00:00', '23:00:00']);
        }
    }

    if($request->has('keyword')) {
        $categorys_ids = Category::select('id')->where('name', 'LIKE', '%'.$request->get('keyword').'%')->lists('id')->toArray();
        $tags_ids = Tag::select('id')->where('name', 'LIKE', '%'.$request->get('keyword').'%')->lists('id')->toArray();
        $courses = $courses->where(function ($query) use ($request, $categorys_ids, $tags_ids) {
            $query
            ->orWhere('name', 'LIKE', '%'.$request->get('keyword').'%')
            ->orWhere(function ($query) use ($request, $categorys_ids) {
                $query->whereHas('categories', function ($query) use ($request, $categorys_ids) {
                    $query->whereIn('category_id', $categorys_ids);
                });
            })->orWhere(function ($query) use ($request, $tags_ids) {
                $query->whereHas('tags', function ($query) use ($request, $tags_ids) {
                    $query->whereIn('tag_id', $tags_ids);
                });
            });
        });
    }

    if($request->has('order_by')) {
        $courses = Course::orderBy('start_date', $request->order_by);
    }

    $tutors = Tutor::orderBy('last_name', 'asc')->take(12)->get();
    $courses = $courses->paginate(10);
    $info = Terminfo::first();
    $course_categories = Category::where('parent_id', '=!', '')->get();

    if(isset($_GET['category_parent']))
    {
        $current_course_category = Category::where('parent_id', $_GET['category_parent'])->get();
        $current_course_category_first = Category::where('id', $_GET['category_parent'])->first();
    }
    return view('frontend.pages.results', compact('courses', 'tutors', 'course_categories', 'current_course_category', 'current_course_category_first', 'info'));
}

Template:

<?php

    // $categories = \App\Category::select('id', 'name', 'parent_id')->get();
    $categories = \App\Category::has('courses')->get();

    $tutors = \App\Tutor::select('id', DB::raw('CONCAT(first_name, " ", last_name) AS full_name'))->orderBy('last_name', 'asc')->lists('full_name', 'id')->toArray();
    $weeks = \App\Course::select('course_weeks')->lists('course_weeks', 'course_weeks');

    $current_day = date('d');
    $current_month = date('m');

    // dd($weeks);

    foreach ($weeks as $week) {
        if($week == 'course_weeks'){

        }else{
            $weeklist[] = $week;
        }
    }

    sort($weeklist);  

    $days = [
            '' => 'Day of the week',
            ' ' => 'Show All',
            'Mon'  => 'Monday',
            'Tue'  => 'Tuesday',
            'Wed'  => 'Wednesday',
            'Thu'  => 'Thursday',
            'Fri'  => 'Friday',
            'Sat'  => 'Saturday',
            'Sun'  => 'Sunday',
    ];

    $time_of_day = [
        ''   => 'Time of the day',
        ' ' => 'Show All',
        'am' => 'Day',
        'pm' => 'Evening'
    ];
?>

<div class="col-sm-4">
</div>
<div class="col-sm-12 course-extras">
    {!! Form::open(['method' => 'get', 'url' => '/results', 'id' => 'search_course_form']) !!}
        <p class="refine-block">Refine your search</p>
        <div class="row refine-search">
            <div class="col-sm-3 search-bar-space">
                {!! Form::text('keyword', isset($_GET['keyword']) ? $_GET['keyword'] : null, ['class' => 'form-control', 'placeholder' => 'Keyword']) !!}
            </div>

            <div class="col-sm-2 search-bar-space ">
                <select name="category_parent" id="category_parent" class="category_parent form-control select-arrow" style="width:100%">
                    <option value="">Category</option>
                    <option value="">Show All</option>
                    @foreach($categories as $category)
                        @if($category->parent_id == 0)
                            <option value="{{ $category->id }}"
                            @if(isset($_GET['category_parent']) AND $_GET['category_parent'] == $category->id)
                                selected
                            @endif
                            >{{ $category->name }}</option>
                        @endif
                    @endforeach
                </select>
            </div>

            {{-- <div class="col-sm-2 search-bar-space">
                {!! Form::select('course_week', $weeks, isset($_GET['course_week']) ? $_GET['course_week'] : null, ['class' => 'form-control']) !!}
            </div> --}}

            <div class="col-sm-2 search-bar-space">
                <select class="form-control" name="course_week">
                    <option value="" selected="">Course Duration</option>
                    <option value=" ">Show All</option>
                    {{-- {{ dd($weeklist) }} --}}
                    @foreach($weeklist as $list)
                        @if($list == 0)
                            <option value="{{ $list }}" 
                                @if(isset($_GET['course_week']) && $_GET['course_week'] == $list)
                                    selected
                                @endif
                            >1 Day</option>
                        @elseif ($list == 1)
                            <option value="{{ $list }}" 
                                @if(isset($_GET['course_week']) && $_GET['course_week'] == $list)
                                    selected
                                @endif
                            >{{ $list }} Week</option>
                        @else 
                            <option value="{{ $list }}" 
                                @if(isset($_GET['course_week']) && $_GET['course_week'] == $list)
                                    selected
                                @endif
                            >{{ $list }} Weeks</option>
                        @endif
                    @endforeach
                </select>
            </div>

            <div class="col-sm-2 search-bar-space">
                <select class="form-control" name="month">
                    <option value="">Select Month</option>
                    <option value="">Show All</option>
                    <option value="01"  @if(isset($_GET['month']) AND $_GET['month'] == '01') selected @endif >January</option>
                    <option value="02"  @if(isset($_GET['month']) AND $_GET['month'] == '02') selected @endif >February</option>
                    <option value="03"  @if(isset($_GET['month']) AND $_GET['month'] == '03') selected @endif >March</option>
                    <option value="04"  @if(isset($_GET['month']) AND $_GET['month'] == '04') selected @endif >April</option>
                    <option value="05"  @if(isset($_GET['month']) AND $_GET['month'] == '05') selected @endif >May</option>
                    <option value="06"  @if(isset($_GET['month']) AND $_GET['month'] == '06') selected @endif >June</option>
                    <option value="07"  @if(isset($_GET['month']) AND $_GET['month'] == '07') selected @endif >July</option>
                    <option value="08"  @if(isset($_GET['month']) AND $_GET['month'] == '08') selected @endif >August</option>
                    <option value="09"  @if(isset($_GET['month']) AND $_GET['month'] == '09') selected @endif >September</option>
                    <option value="10"  @if(isset($_GET['month']) AND $_GET['month'] == '10') selected @endif >October</option>
                    <option value="11"  @if(isset($_GET['month']) AND $_GET['month'] == '11') selected @endif >November</option>
                    <option value="12"  @if(isset($_GET['month']) AND $_GET['month'] == '12') selected @endif >December</option>
                </select>
                <!--input type="text" class="form-control" name="start_date" value="{!! isset($_GET['start_date']) ? $_GET['start_date'] : '' !!}" placeholder="Date Range"/-->
            </div>

            <div class="col-sm-3 search-bar-space">
                <div align="center">
                    <button type="button" class="options-btn pull-left clickMe less-border hidden-tablet" style="width:50%">MORE OPTIONS<i class="fa fa-angle-down options-arrow"></i></button>


                    <button type="button" class="options-btn pull-left clickMe2 less-border display-tablet" style="width:50%">MORE</button>

                    <button type="submit" class="find-btn" style="width:50%">FIND</button>
                </div>
            </div>
        </div>

        {{-- <div class="row grey-back list-padding " id="clickBox" style="display: none"> --}}
        <div class="row grey-back list-padding " id="clickBox" style="display: {{ Route::currentRouteName() == 'pages.results' ? 'block':'none' }}">
          <div class="col-sm-3 search-bar-space">
              <select name="category_child" id="category_child" class="category_child form-control back-white" style="width:100%">
                    <option value="" data-parent-id="0">Subcategory</option>
                    <option value="">Show All</option>
                    @foreach($categories as $category)
                        @if($category->parent_id != 0)
                            <option value="{{ $category->id }}" data-parent-id="{{ $category->parent_id }}"
                                @if(isset($_GET['category_child']) AND $_GET['category_child'] == $category->id)
                                selected
                                @endif
                            >{{ $category->name }}</option>
                        @endif
                    @endforeach
                </select>
          </div>
          <div class="col-sm-3 search-bar-space">
                {!! Form::select('day', $days, isset($_GET['day']) ? $_GET['day'] : null, ['class' => 'form-control back-white']) !!}
          </div>
          <div class="col-sm-3 search-bar-space">
                {!! Form::select('time_of_day', $time_of_day, isset($_GET['time_of_day']) ? $_GET['time_of_day'] : null, ['class' => 'form-control back-white']) !!}
          </div>
          <div class="col-sm-3 search-bar-space">
                {!! Form::select('tutor', ['' => 'Tutors'] + $tutors, isset($_GET['tutor']) ? $_GET['tutor'] : null, ['class' => 'form-control back-white']) !!}
          </div>
        </div>
        <br><hr>
    {!! Form::close() !!}
</div>

You are creating an entirely new query when you add the order by in your code on line 83. This overwrites the $courses object and removes all existing filters.

$courses = Course::orderBy('start_date', $request->order_by);

You should change this so it adds to the existing query. It should be like this:

$courses = $courses->orderBy('start_date', $request->order_by);

What i found in your code is, you wants conditional order by, you have made mistake by creating new Query of Course Model, just replace following code,

if($request->has('order_by')) {
        $courses->orderBy('start_date', $request->order_by);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM