function filter($filter, $value, $filters = '') { parse_str($filters, $filters); // resetting dependencies // if ('type'==$filter or 'commercial'==$filter) { // $filters = reset_dependencies($filters); // } $type = detect_filter_type($value); if ('check' == $type) { $is_on = array_key_exists($filter, $filters); unset($filters[$filter]); $filter_query = implode_assoc('&', $filters); if ($is_on) { return $filter_query; } else { return $filter_query . "&{$filter}={$value}"; } } else { if ('list' == $type) { // $filters[$filter] = [asus;acer;lenovo;toshiba;sony]; // $value = [asus] // $result = [acer;lenovo;toshiba;sony] $value = trim($value, '[]'); $old_filter = trim($filters[$filter], '[]'); $items = explode(';', $old_filter); $is_on = in_array($value, $items); $clear_filter = array_values(array_diff($items, [$value])); $clear_filter_str = implode(';', $clear_filter); unset($filters[$filter]); $filter_query = implode_assoc('&', $filters); if ($is_on) { return $filter_query . "&{$filter}=[{$clear_filter_str}]"; } else { return $filter_query . "&{$filter}=[{$clear_filter_str};{$value}]"; } } else { if ('range' == $type) { unset($filters[$filter]); $filter_query = implode_assoc('&', $filters); return $filter_query . "&{$filter}={$value}"; } else { if ('type' == $type) { $is_on = (array_key_exists($filter, $filters) and $filters[$filter] == $value); // important parenthesis unset($filters[$filter]); $filter_query = implode_assoc('&', $filters); if ($is_on) { return $filter_query; } else { return $filter_query . "&{$filter}={$value}"; } } } } } }
function apply_filters(Illuminate\Database\Eloquent\Builder $query, $filters = '') { parse_str($filters, $filters); foreach ($filters as $filter => $value) { if ('' == $value or ';' == $value or '[]' == $value) { continue; } //resetting dependencies // if ('type'==$filter or 'commercial'==$filter) { // $filters = reset_dependencies($filters); // } $type = detect_filter_type($value); if ('check' == $type) { $query->where($filter, 1); } else { if ('list' == $type) { $list = trim($value, '[]'); $items = explode(';', $list); $query->whereIn($filter, $items); } else { if ('range' == $type) { $range = explode(';', $value); $query->where($filter, '>=', $range[0])->where($filter, '<=', $range[1]); } else { if ('type' == $type) { /*------------------------------------------------ | JOIN DEPENDENCIES ------------------------------------------------*/ if ('town_id' == $filter) { $filter = 'towns.town_id'; } if ('district_id' == $filter) { $filter = 'districts.district_id'; } /*----------------------------------------------*/ $query->where($filter, $value); } } } } } return $query; }