2

此方法获取搜索关键字和解析的 mysql 查询,并重写 where 表达式以包含 LIKE %keyword%。

它运作良好,但我不知道有这么多循环的方法是好还是坏......

private function build_where($query_array, $options)  
{  
    //add WHERE starting point  
    $where = '';        

    if(!empty($query_array['WHERE']))
    {
        //build where array
        $where_array = $query_array['WHERE'];   

        //start the where
        $where .= 'WHERE ';

        //get columns array
        $columns_array = $this->build_columns_array($query_array);

        //if there is a search string           
        if(!empty($options['sSearch']))
        {
            //check for enabled columns
            $i = 0;
            $columns_length = count($columns_array);
            for($i; $i < intval($columns_length); $i++)
            {
                //create the options boolean array
                $searchable_columns['bSearchable_'.$i] = $options['bSearchable_'.$i];
            }

            //loop through searchable_columns for true values
            foreach($searchable_columns as $searchable_column_key => $searchable_column_val)
            {
                if($searchable_column_val == true)
                {
                    //get an integer from the searchable_column key
                    $column_id = preg_replace("/[^0-9]/", '', $searchable_column_key);

                    //lookup column name by index
                    foreach($columns_array as $columns_array_key => $columns_array_val)
                    {
                        //if the $columns_array_key matches the $column_id
                        if($columns_array_key == $column_id)
                        {
                            //loop to build where foreach base expression
                            $i = 0;
                            $where_length = count($where_array);
                            for($i; $i < intval($where_length); $i++)
                            {
                                //append the existing WHERE Expressions
                                $where .= $where_array[$i]['base_expr'];
                            }                               

                            //append the LIKE '%$options['sSearch'])%'
                            $where .= ' AND '.$columns_array_val." LIKE '%".$options['sSearch']."%' OR ";
                        }
                    }   
                }
            }
            //remove the last OR
            $where = substr_replace($where, "", -3);                                    
        }
        else
        {
            //loop to build where
            $i = 0;
            $where_length = count($where_array);
            for($i; $i < intval($where_length); $i++)
            {
                $where .= $where_array[$i]['base_expr'];
            } 
        }            
    }

    //print_r($where_length);
    return $where;
}
4

3 回答 3

5

Kent Beck 或 Martin Fowler 的学派实际上会建议您将这些大方法重构为许多小方法。在我看来,它不容易阅读,这将是重构的主要原因。

于 2011-02-26T22:02:31.883 回答
2

分解方法主要不是关于重用。这样做可以使代码更易于阅读、测试和维护。清晰的方法名称也可以代替内联注释。这个方法做了两个可以分开的高级事情:构建一个带选项和不带选项的 where 子句。对我的另一个提示是,使用选项构建 where 子句的逻辑看起来足够丰富,足以保证它自己的方法。

private function build_where($query_array, $options) {
    if(!empty($query_array['WHERE'])) {
        $where_array = $query_array['WHERE'];
        $columns_array = $this->build_columns_array($query_array);
        if (empty($options['sSearch'])) {
            return $this->build_where_with_options($where_array, $columns_array, $options);
        }
        else {
            return $this->build_where_without_options($where_array, $columns_array);
        }
    }
    else {
        return '';
    }
}

现在您可以快速浏览一下,可以build_where()看到 where 子句可能采用三种可能的形式,以及每个形式需要在何时与输入一起产生其结果。

以下是您可以在整个代码中进行的一些小的改进:

  • count()返回一个整数,并且不需要循环intval()中的调用。for即使你把它们留在里面,最好在循环之外应用调用,这样它只完成一次,因为它每次产生相同的值。
  • if($searchable_column_val == true)等价于if($searchable_column_val)因为两者都$searchable_column_val转换为布尔值,并且后者在转换的布尔值等于时通过true
  • $where = substr_replace($where, "", -3)可以替换$where = substr($where, 0, -3)为更清晰一点。
  • 您可以通过简单地使用该键获取值来利用 PHP 的数组,而不是遍历数组来寻找特定的键。

最后一个,这段代码

foreach($columns_array as $columns_array_key => $columns_array_val)
{
    //if the $columns_array_key matches the $column_id
    if($columns_array_key == $column_id)
    { ... }
}

可以用这个代替

$columns_array_val = $columns_array[$column_id];
...
于 2011-02-26T22:42:34.957 回答
1

个人喜好真的。一些程序员会将其分解为几个函数。就个人而言,我认为你拥有它的方式很好。如果我看到一些我认为可以重用的东西,我会将它重构为一个可以包含的单独文件。

在我看来,一些程序员在他们有东西可以重用它之前就太快地把东西变成“可重用的”。

于 2011-02-26T21:57:11.593 回答