此方法搜索搜索关键字并解析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;
}
答案 0 :(得分:5)
Kent Beck或Martin Fowler的思想学派实际上会建议你将这些大型方法重构为许多小方法。在我看来,这并不容易阅读,这将是重构的主要原因。
答案 1 :(得分:2)
分解方法主要不是重用。这样做可以使代码更易于阅读,测试和维护。清除方法名称也可以替代内联注释。这个方法做了两个可以分开的高级事情:用选项构建一个where子句而没有选项。另一个暗示是,使用options构建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)
,并且更加清晰。对于最后一个,这段代码
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];
...
答案 2 :(得分:1)
真正的个人偏好。一些程序员会把它分成几个函数。就个人而言,我认为你拥有它的方式很好。如果我看到一些我认为可以重复使用的内容,我会将其重构为一个可以包含的单独文件。
在我看来,一些程序员在他们甚至没有重复使用之前就太快速地让事情变得“可以补偿”。