grocery_crud子句不与过滤器一起使用



在我修复错误的项目中,使用了grocery_crud((插件。该文档的示例是使用以下内容:

$crud = new grocery_CRUD();
$crud->set_language($this->config->item('language'));  
$crud->set_table('users_products');      
$crud->where('users_products.users_id !=', 1);

该表不包含不符合条件的记录。看起来一切都还好。不幸的是,当用户使用插件下的过滤器时,搜索结果也包括不符合条件的记录。

我在做什么错?我如何添加搜索术语?

好吧,我找到了解决问题的解决方案。也许它不是完美的,可能需要一些重构,但我认为每个人都会理解该解决方案的原则:

in/application/models/grocery_crud_model.php我们必须添加两个功能:

    function group_start()
    {
        $this->db->group_start();
    }
    function group_end()
    {
        $this->db->group_end();
    }

in/application/libraries/grocery_crud.php我们添加:

    public function whereFix($key, $value = NULL, $escape = TRUE)
    {
        $this->whereFix[] = array($key,$value,$escape);
        return $this;
    }

在同一文件中,我们添加了循环以创建wery的条件,并通过group_start((和group_end((为其他类型的术语关闭。实际上,我们可以替换functions get_list((和get_total_results((:

    protected function get_list()
    {
        if(!empty($this->whereFix))
            foreach($this->whereFix as $where)
                $this->basic_model->where($where[0],$where[1],$where[2]);
        if(!empty($this->order_by))
            $this->basic_model->order_by($this->order_by[0],$this->order_by[1]);

        if(!empty($this->where)){
                    $this->basic_model->group_start();
            foreach($this->where as $where)
                $this->basic_model->where($where[0],$where[1],$where[2]);
                    $this->basic_model->group_end();
                }
        if(!empty($this->or_where)){
                    $this->basic_model->group_start();
            foreach($this->or_where as $or_where)
                $this->basic_model->or_where($or_where[0],$or_where[1],$or_where[2]);
                    $this->basic_model->group_end();
                }        
        if(!empty($this->like)){
                    $this->basic_model->group_start();
            foreach($this->like as $like)
                $this->basic_model->like($like[0],$like[1],$like[2]);
                    $this->basic_model->group_end();
                }
        if(!empty($this->or_like)){
                    $this->basic_model->group_start();
            foreach($this->or_like as $or_like)
                $this->basic_model->or_like($or_like[0],$or_like[1],$or_like[2]);
                    $this->basic_model->group_end();
                }
        if(!empty($this->having))
            foreach($this->having as $having)
                $this->basic_model->having($having[0],$having[1],$having[2]);
        if(!empty($this->or_having))
            foreach($this->or_having as $or_having)
                $this->basic_model->or_having($or_having[0],$or_having[1],$or_having[2]);
        if(!empty($this->relation))
            foreach($this->relation as $relation)
                $this->basic_model->join_relation($relation[0],$relation[1],$relation[2]);
        if(!empty($this->relation_n_n))
        {
            $columns = $this->get_columns();
            foreach($columns as $column)
            {
                //Use the relation_n_n ONLY if the column is called . The set_relation_n_n are slow and it will make the table slower without any reason as we don't need those queries.
                if(isset($this->relation_n_n[$column->field_name]))
                {
                    $this->basic_model->set_relation_n_n_field($this->relation_n_n[$column->field_name]);
                }
            }
        }
        if($this->theme_config['crud_paging'] === true)
        {
            if($this->limit === null)
            {
                $default_per_page = $this->config->default_per_page;
                if(is_numeric($default_per_page) && $default_per_page >1)
                {
                    $this->basic_model->limit($default_per_page);
                }
                else
                {
                    $this->basic_model->limit(10);
                }
            }
            else
            {
                $this->basic_model->limit($this->limit[0],$this->limit[1]);
            }
        }
        $results = $this->basic_model->get_list();
        return $results;
    }
    protected function get_total_results()
    {
        if(!empty($this->whereFix))
            foreach($this->whereFix as $where)
                $this->basic_model->where($where[0],$where[1],$where[2]);
                if(!empty($this->where)){
                    $this->basic_model->group_start();
            foreach($this->where as $where)
                $this->basic_model->where($where[0],$where[1],$where[2]);
                    $this->basic_model->group_end();
                }
        if(!empty($this->or_where)){
                    $this->basic_model->group_start();
            foreach($this->or_where as $or_where)
                $this->basic_model->or_where($or_where[0],$or_where[1],$or_where[2]);
                    $this->basic_model->group_end();
                }
        if(!empty($this->like)){
                    $this->basic_model->group_start();
            foreach($this->like as $like)
                $this->basic_model->like($like[0],$like[1],$like[2]);
                    $this->basic_model->group_end();
                }
        if(!empty($this->or_like)){
                    $this->basic_model->group_start();
            foreach($this->or_like as $or_like)
                $this->basic_model->or_like($or_like[0],$or_like[1],$or_like[2]);
                    $this->basic_model->group_end();
                }
        if(!empty($this->having))
            foreach($this->having as $having)
                $this->basic_model->having($having[0],$having[1],$having[2]);
        if(!empty($this->or_having))
            foreach($this->or_having as $or_having)
                $this->basic_model->or_having($or_having[0],$or_having[1],$or_having[2]);
        if(!empty($this->relation))
            foreach($this->relation as $relation)
                $this->basic_model->join_relation($relation[0],$relation[1],$relation[2]);
        if(!empty($this->relation_n_n))
        {
            $columns = $this->get_columns();
            foreach($columns as $column)
            {
                //Use the relation_n_n ONLY if the column is called . The set_relation_n_n are slow and it will make the table slower without any reason as we don't need those queries.
                if(isset($this->relation_n_n[$column->field_name]))
                {
                    $this->basic_model->set_relation_n_n_field($this->relation_n_n[$column->field_name]);
                }
            }
        }
        return $this->basic_model->get_total_results();
    }

我希望此代码对某人有用。

最新更新