Microweber\Traits\QueryFilter::map_filters PHP Метод

map_filters() публичный Метод

public map_filters ( $query, &$params, $table )
    public function map_filters($query, &$params, $table)
    {
        $dbDriver = Config::get('database.default');
        if (!isset($params['count']) and !isset($params['count_paging'])) {
            if (isset($params['paging_param']) and isset($params[$params['paging_param']]) and $params['paging_param'] != 'current_page') {
                $params['current_page'] = intval($params[$params['paging_param']]);
                unset($params[$params['paging_param']]);
            }
        }
        $is_limit = false;
        if (isset($params['limit'])) {
            $is_limit = $params['limit'];
        }
        $is_id = false;
        if (isset($params['id'])) {
            $is_id = $params['id'];
        }
        $is_fields = false;
        if (isset($params['fields']) and $params['fields'] != false) {
            $is_fields = $params['fields'];
            if (!is_array($is_fields)) {
                $is_fields = explode(',', $is_fields);
            }
            if (is_array($is_fields) and !empty($is_fields)) {
                foreach ($is_fields as $is_field) {
                    if (is_string($is_field)) {
                        $is_field = trim($is_field);
                        if ($is_field != '') {
                            $query = $query->select($table . '.' . $is_field);
                        }
                        $query = $query->select($table . '.*');
                    }
                }
            }
        } else {
            $query = $query->select($table . '.*');
        }
        foreach ($params as $filter => $value) {
            $compare_sign = false;
            $compare_value = false;
            if (is_string($value)) {
                if (stristr($value, '[lt]')) {
                    $compare_sign = '<';
                    $value = str_replace('[lt]', '', $value);
                } elseif (stristr($value, '[lte]')) {
                    $compare_sign = '<=';
                    $value = str_replace('[lte]', '', $value);
                } elseif (stristr($value, '[st]')) {
                    $compare_sign = '<';
                    $value = str_replace('[st]', '', $value);
                } elseif (stristr($value, '[ste]')) {
                    $compare_sign = '<=';
                    $value = str_replace('[ste]', '', $value);
                } elseif (stristr($value, '[gt]')) {
                    $compare_sign = '>';
                    $value = str_replace('[gt]', '', $value);
                } elseif (stristr($value, '[gte]')) {
                    $compare_sign = '>=';
                    $value = str_replace('[gte]', '', $value);
                } elseif (stristr($value, '[mt]')) {
                    $compare_sign = '>';
                    $value = str_replace('[mt]', '', $value);
                } elseif (stristr($value, '[md]')) {
                    $compare_sign = '>';
                    $value = str_replace('[md]', '', $value);
                } elseif (stristr($value, '[mte]')) {
                    $compare_sign = '>=';
                    $value = str_replace('[mte]', '', $value);
                } elseif (stristr($value, '[mde]')) {
                    $compare_sign = '>=';
                    $value = str_replace('[mde]', '', $value);
                } elseif (stristr($value, '[neq]')) {
                    $compare_sign = '!=';
                    $value = str_replace('[neq]', '', $value);
                } elseif (stristr($value, '[eq]')) {
                    $compare_sign = '=';
                    $value = str_replace('[eq]', '', $value);
                } elseif (stristr($value, '[int]')) {
                    $value = str_replace('[int]', '', $value);
                    $value = intval($value);
                } elseif (stristr($value, '[is]')) {
                    $compare_sign = '=';
                    $value = str_replace('[is]', '', $value);
                } elseif (stristr($value, '[like]')) {
                    $compare_sign = 'LIKE';
                    $value = str_replace('[like]', '', $value);
                    $compare_value = '%' . $value . '%';
                } elseif (stristr($value, '[not_like]')) {
                    $value = str_replace('[not_like]', '', $value);
                    $compare_sign = 'NOT LIKE';
                    $compare_value = '%' . $value . '%';
                } elseif (stristr($value, '[is_not]')) {
                    $value = str_replace('[is_not]', '', $value);
                    $compare_sign = 'NOT LIKE';
                    $compare_value = '%' . $value . '%';
                } elseif (stristr($value, '[in]')) {
                    $value = str_replace('[in]', '', $value);
                    $compare_sign = 'in';
                } elseif (stristr($value, '[not_in]')) {
                    $value = str_replace('[not_in]', '', $value);
                    $compare_sign = 'not_in';
                }
                if ($filter == 'created_at' or $filter == 'updated_at') {
                    $compare_value = date('Y-m-d H:i:s', strtotime($value));
                }
            }
            switch ($filter) {
                case 'fields':
                    $fields = $value;
                    if ($fields != false and is_string($fields)) {
                        $fields = explode(',', $fields);
                    }
                    if (is_array($fields) and !empty($fields)) {
                        $query = $query->select($fields);
                    }
                    unset($params[$filter]);
                    break;
                case 'keyword':
                    if (isset($params['search_in_fields'])) {
                        $to_search_in_fields = $params['search_in_fields'];
                        if (isset($params['keyword'])) {
                            $params['keyword'] = urldecode($params['keyword']);
                            $to_search_keyword = $params['keyword'];
                        }
                        if ($to_search_in_fields != false and $to_search_keyword != false) {
                            if ($dbDriver == 'sqlite') {
                                $pdo = DB::connection('sqlite')->getPdo();
                                $pdo->sqliteCreateFunction('regexp', function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS') {
                                    if (isset($pattern, $data) === true) {
                                        return preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0;
                                    }
                                    return;
                                });
                            }
                            $to_search_keywords = explode(',', $to_search_keyword);
                            if (!empty($to_search_keywords)) {
                                $kw_number_counter = 0;
                                foreach ($to_search_keywords as $to_search_keyword) {
                                    $to_search_keyword = trim($to_search_keyword);
                                    if ($to_search_keyword != false) {
                                        if (is_string($to_search_in_fields)) {
                                            $to_search_in_fields = explode(',', $to_search_in_fields);
                                        }
                                        $to_search_keyword = preg_replace("/(^\\s+)|(\\s+\$)/us", '', $to_search_keyword);
                                        $to_search_keyword = strip_tags($to_search_keyword);
                                        $to_search_keyword = str_replace('\\', '', $to_search_keyword);
                                        $to_search_keyword = str_replace('*', '', $to_search_keyword);
                                        $to_search_keyword = str_replace(';', '', $to_search_keyword);
                                        if ($to_search_keyword != '') {
                                            if (!empty($to_search_in_fields)) {
                                                $where_or_where = 'orWhere';
                                                if (isset($params['keywords_exact_match'])) {
                                                    $where_or_where = 'where';
                                                }
                                                //check search in joined table
                                                $search_joined_tables_check = array();
                                                foreach ($to_search_in_fields as $to_search_in_field) {
                                                    $check_if_join_is_needed = explode('.', $to_search_in_field);
                                                    if (isset($check_if_join_is_needed[1])) {
                                                        $rest = $check_if_join_is_needed[0];
                                                        if (!isset($search_joined_tables_check[$rest])) {
                                                            $query = $query->join($rest, $rest . '.rel_id', '=', $table . '.id')->where($rest . '.rel_type', $table)->distinct();
                                                            $search_joined_tables_check[$rest] = true;
                                                        }
                                                    }
                                                }
                                                $query->{$where_or_where}(function ($query) use($to_search_in_fields, $to_search_keyword, $params, $table) {
                                                    foreach ($to_search_in_fields as $to_search_in_field) {
                                                        $query = $query->orWhere($to_search_in_field, 'REGEXP', $to_search_keyword);
                                                    }
                                                    if (isset($params['is_active'])) {
                                                        $query->where('is_active', $params['is_active']);
                                                    }
                                                    if (isset($params['is_deleted'])) {
                                                        $query->where('is_deleted', $params['is_deleted']);
                                                    }
                                                });
                                                //  $query->distinct();
                                            }
                                        }
                                    }
                                    $kw_number_counter++;
                                }
                            }
                        }
                    }
                    unset($params[$filter]);
                    break;
                case 'single':
                case 'one':
                    break;
                case 'category':
                case 'categories':
                    $ids = $value;
                    if (is_string($ids)) {
                        $ids = explode(',', $ids);
                    } elseif (is_int($ids)) {
                        $ids = array($ids);
                    }
                    if (is_array($ids)) {
                        //                        $query = $query->leftJoin('categories_items', function($join) use ($table,$ids)
                        //                        {
                        //                            $join->on('categories_items.rel_id', '=',  $table . '.id');
                        //                            $join->on('categories_items.rel_type', '=',  $table);
                        //                          //  $join->whereIn('categories_items.parent_id', $ids);
                        //
                        //                        })->whereIn('categories_items.parent_id', $ids)->groupBy('categories_items.rel_id');
                        $query = $query->leftJoin('categories_items', 'categories_items.rel_id', '=', $table . '.id')->where('categories_items.rel_type', $table)->whereIn('categories_items.parent_id', $ids)->distinct();
                    }
                    unset($params[$filter]);
                    break;
                case 'order_by':
                    $order_by_criteria = explode(',', $value);
                    foreach ($order_by_criteria as $c) {
                        $c = urldecode($c);
                        $c = explode(' ', $c);
                        if (isset($c[0]) and trim($c[0]) != '') {
                            $c[0] = trim($c[0]);
                            if (isset($c[1])) {
                                $c[1] = trim($c[1]);
                            }
                            if (isset($c[1]) and $c[1] != '') {
                                $query = $query->orderBy($c[0], $c[1]);
                            } elseif (isset($c[0])) {
                                $query = $query->orderBy($c[0]);
                            }
                        }
                    }
                    unset($params[$filter]);
                    break;
                case 'group_by':
                    $group_by_criteria = explode(',', $value);
                    foreach ($group_by_criteria as $c) {
                        $query = $query->groupBy(trim($c));
                    }
                    if ($dbDriver == 'pgsql') {
                        $query = $query->groupBy($table . '.id');
                    }
                    unset($params[$filter]);
                    break;
                case 'limit':
                    $criteria = intval($value);
                    $query = $query->take($criteria);
                    unset($params['limit']);
                    break;
                case 'current_page':
                    $criteria = 1;
                    if ($value > 1) {
                        if ($is_limit != false) {
                            $criteria = intval($value - 1) * intval($is_limit);
                        }
                    }
                    if ($criteria > 1) {
                        $query = $query->skip($criteria);
                    }
                    unset($params[$filter]);
                    break;
                case 'ids':
                    $ids = $value;
                    if (is_string($ids)) {
                        $ids = explode(',', $ids);
                    } elseif (is_int($ids)) {
                        $ids = array($ids);
                    }
                    if (isset($ids) and is_array($ids) == true) {
                        foreach ($ids as $idk => $idv) {
                            $ids[$idk] = intval($idv);
                        }
                    }
                    if (is_array($ids)) {
                        $query = $query->whereIn($table . '.id', $ids);
                    }
                    unset($params[$filter]);
                    break;
                case 'remove_ids':
                case 'exclude_ids':
                    unset($params[$filter]);
                    $ids = $value;
                    if (is_string($ids)) {
                        $ids = explode(',', $ids);
                    } elseif (is_int($ids)) {
                        $ids = array($ids);
                    }
                    if (isset($ids) and is_array($ids) == true) {
                        foreach ($ids as $idk => $idv) {
                            $ids[$idk] = intval($idv);
                        }
                    }
                    if (is_array($ids)) {
                        $query = $query->whereNotIn($table . '.id', $ids);
                    }
                    break;
                case 'id':
                    unset($params[$filter]);
                    $criteria = trim($value);
                    if ($compare_sign != false) {
                        if ($compare_value != false) {
                            $val = $compare_value;
                        } else {
                            $val = $value;
                        }
                        $query = $query->where($table . '.id', $compare_sign, $val);
                    } else {
                        $query = $query->where($table . '.id', $criteria);
                    }
                    break;
                case 'no_cache':
                    $this->useCache = false;
                    break;
                    //                case 'is_active':
                    //                case 'is_deleted':
                    //                $query = $query->select($table . '.' . $filter);
                    //
                    //                $query = $query->where($table . '.'.$filter, $value);
                    //
                    //                break;
                //                case 'is_active':
                //                case 'is_deleted':
                //                $query = $query->select($table . '.' . $filter);
                //
                //                $query = $query->where($table . '.'.$filter, $value);
                //
                //                break;
                case 'search_params':
                    $search_items = $value;
                    if (is_array($search_items) and !empty($search_items)) {
                        foreach ($search_items as $search_item_key => $search_key_value) {
                            switch ($search_item_key) {
                                case 'custom_field':
                                    if (is_array($search_key_value) and !empty($search_key_value)) {
                                        // $query =  $query->select('custom_fields.id');
                                        $query = $query->join('custom_fields', 'custom_fields.rel_id', '=', $table . '.id')->where('custom_fields.rel_type', $table);
                                        $query = $query->join('custom_fields_values', function ($join) use($table, $search_key_value, $query) {
                                            $join->on('custom_fields_values.custom_field_id', '=', 'custom_fields.id');
                                            foreach ($search_key_value as $search_key_value_k => $search_key_value_v) {
                                                //  $join->on('custom_fields.name_key', '=', $search_key_value_k);
                                                //   $join->on('custom_fields.name_key', '=', $search_key_value_k);
                                                $join->on('custom_fields_values.value', '=', $search_key_value_v);
                                            }
                                        });
                                        $query = $query->join('custom_fields as custom_fields_names_q', function ($join) use($table, $search_key_value, $query) {
                                            foreach ($search_key_value as $search_key_value_k => $search_key_value_v) {
                                                $join->orOn('custom_fields_names_q.name_key', '=', $search_key_value_k);
                                                $join->orOn('custom_fields_names_q.name', '=', $search_key_value_k);
                                                $join->orOn('custom_fields_names_q.type', '=', $search_key_value_k);
                                            }
                                        });
                                        $query = $query->distinct();
                                    }
                                    break;
                            }
                        }
                    }
                    break;
                case $this->_is_closure($params[$filter]):
                    $query = $query->where(function ($query) use(&$params, $filter) {
                        $call = $params[$filter];
                        unset($params[$filter]);
                        //call_user_func_array($call, $params);
                        call_user_func($call, $query, $params);
                    });
                    break;
                default:
                    if ($compare_sign != false) {
                        unset($params[$filter]);
                        if ($compare_value != false) {
                            $query = $query->where($table . '.' . $filter, $compare_sign, $compare_value);
                        } else {
                            if ($compare_sign == 'in' || $compare_sign == 'not_in') {
                                if (is_string($value)) {
                                    $value = explode(',', $value);
                                } elseif (is_int($value)) {
                                    $value = array($value);
                                }
                                if (is_array($value)) {
                                    if ($compare_sign == 'in') {
                                        $query = $query->whereIn($table . '.' . $filter, $value);
                                    } elseif ($compare_sign == 'not_in') {
                                        $query = $query->whereIn($table . '.' . $filter, $value);
                                    }
                                }
                            } else {
                                $query = $query->where($table . '.' . $filter, $compare_sign, $value);
                            }
                        }
                    }
                    break;
            }
        }
        foreach (self::$custom_filters as $name => $callback) {
            if (!isset($params[$name])) {
                continue;
            }
            call_user_func_array($callback, [$query, $params[$name], $table]);
        }
        return $query;
    }