app\Product::scopeRefine PHP Method

scopeRefine() public method

public scopeRefine ( $query, $filters )
    public function scopeRefine($query, $filters)
    {
        foreach ($filters as $key => $value) {
            switch ($key) {
                case 'category':
                    $children = \Cache::remember('progeny_of_' . $value, 15, function () use($value) {
                        Category::progeny($value, $children, ['id']);
                        return $children;
                    });
                    $children[] = ['id' => $value * 1];
                    $query->whereIn('category_id', $children);
                    break;
                case 'conditions':
                    $query->where('condition', 'LIKE', $value);
                    break;
                case 'brands':
                    $query->where('brand', 'LIKE', $value);
                    break;
                case 'min':
                case 'max':
                    $min = array_key_exists('min', $filters) ? trim($filters['min']) != '' ? $filters['min'] : '' : '';
                    $max = array_key_exists('max', $filters) ? trim($filters['max']) != '' ? $filters['max'] : '' : '';
                    if ($min != '' && $max != '') {
                        $query->whereBetween('price', [$min, $max]);
                    } elseif ($min == '' && $max != '') {
                        $query->where('price', '<=', $max);
                    } elseif ($min != '' && $max == '') {
                        $query->where('price', '>=', $min);
                    }
                    break;
                default:
                    if ($key != 'category_name' && $key != 'search' && $key != 'page') {
                        //changing url encoded character by the real ones
                        $value = urldecode($value);
                        //applying filter to json field
                        $query->whereRaw("features LIKE '%\"" . $key . '":%"%' . str_replace('/', '%', $value) . "%\"%'");
                    }
                    break;
            }
        }
    }