0

Its an eCommerce app that has filters where parameters are taken dynamically from a table.

"Filters" table looks like following:

id | group | label | value
----+----------+-------------------+----------------

12 | deadline | 1 to 3 days | 1 AND 3
14 | budget | Any | 0
15 | budget | Less than 1000 | 1,1000
16 | budget | 1000 to 10000 | 1000, 10000
22 | location | Any | 0
23 | location | New York | newyork
24 | location | California | california
25 | location | Alabama | alabama

One of the parameters among many is: "Budget" and the checkbox options are:

All

1000 to 9999

10000 to 99999

100000 to 999999

Users can check multiple options here.

I'm trying to build search queries dynamically from this filter: (refer here https://m.dotdev.co/writing-advanced-eloquent-search-query-filters-de8b6c2598db)

View file for filters:

@foreach ($groups as $group => $filters)
                <div class="panel panel-default">
                    <b>{{ $group }}</b>
                    @foreach($filters as $filter)
                        <div id="collapseOne1" class="panel-collapse collapse in">
                            <div class="panel-body">
                                <div class="checkbox">
                                    <label><input class="
                                    <?php if ($filter->value == '0') { ?>
                                            {{ $filter->group }}
                                    <?php } else { ?>
                                                {{ $filter->group."Child" }}
                                    <?php }?>" type="checkbox" name="{{ $filter->group }}" value="{{ $filter->value }}">{{ $filter->label }}</label>
                                </div>
                            </div>
                        </div>
                    @endforeach
                </div>
       @endforeach

The controller has:

$requests = $requests->newQuery();
if ($request->has('budget')) {
        foreach (explode(',',$request->budget) as $budget) {
            $min = 0;
            $max = 1;
            if($budget < $min){
                $min = $budget;
            }
            if($budget > $max){
                $max = $budget;
            }
        }
            $requests->whereBetween('budget',[$min, $max]);
        }
$requests = $requests->paginate(5);
...

The above code doesn't seem to be working as it always sets min = 0. Can somebody tell how I can create a dynamic query out of a dynamically generated multi-choice filters in Laravel?

Thanks in advance,

chuck
  • 125
  • 3
  • 16

1 Answers1

0

Unless the price is somehow negative, your $min will always be 0...? I don't fully understand what the problem is. You can chain queries together dynamically, but this seems to be logic problem, less than a query builder problem?

Edit based on the comment:

The problem is that $budget < $min will never return true, unless your $budget is somehow negative. 1000 < 0 => will return false, so it will never set $min to $budget. So you'll need to set a decent $min value. What you might wanna do is:

$min = $request->input('budget', 0);

This will assign $min to the budget parameter in your request, but if that parameter does not exist, it will default to 0.

jlos
  • 1,010
  • 1
  • 8
  • 12
  • The problem is that users can select multiple checkboxes at once. For e.g., I could select two options like 1000 to 10000 and 10000 to 100000. Here, the min value should be 1000 and max will be 100000. But my problem with the query is that it is always set to 0, no matter what I select. Yes, you're right, it's coding issue. Since I'm new to Laravel, I'm finding it hard , so, seeking some help here. Appreciate any online material for help. Thanks again. – chuck Sep 17 '17 at 14:50