2017-08-08 181 views
0

这有什么更好的解决方案。SQL Concat Where子句

我有一个函数包含三个可选参数(businessunit_id,department_id,jobtitle)。我必须根据接收参数建立动态的WHERE SQL子句。

CODE

public function getEmpSearchResult($businessunit_id,$department_id,$jobtitle) 
{ 
    $i=0; 
    $WHERE = ""; 
    if (!empty($businessunit_id)) 
     { 
      if($i==1) { 
       $WHERE = $WHERE." AND"; 
      } 
      $WHERE = "businessunit_id"."=".$businessunit_id; 
      $i=1; 
     } 

    if (!empty($department_id)) 
     { if($i==1) { 
       $WHERE = $WHERE." AND"; 
      } 
      $WHERE = $WHERE." department_id"."=".$department_id; 
      $i=1; 
     } 

    if (!empty($jobtitle)) 
     { 
      if($i==1) { 
       $WHERE = $WHERE." AND"; 
      } 
      $WHERE = $WHERE." jobtitle_id"."=".$jobtitle; 
      $i=1; 
     } 

    $query = "SELECT * FROM `main_employees_summary` WHERE $WHERE "; 
    $data = $db->query($query)->fetchAll(); 
    return $data; 

在上面的代码中。内置WHERE条件我concating $ WHERE变量和使用$ I变量来跟踪并在必要时条件。

是否有任何优化的方法来实现这一目标?

+2

收集到数组,然后'implode' –

+1

要添加到^,请使用预准备语句。 –

回答

1

是否有任何优化的方式来实现这一目标?

我的理解是,“更易于维护,更易于阅读”而不是“性能优化” - 基于更广泛的问题的上下文。

这种类型的代码有80%是我鼓励其他程序员使用数据库抽象库的原因。性能方面的成本很少会影响代码清洁的好处。

它看起来不像你已经在使用PHP框架,所以我猜你可能不会已经在使用composer。我建议您将它引入到您的项目中,然后使用它来引入数据抽象,如doctrineeloquent

对于使用这些库和工具,您会在SO上找到大量的帮助。

doctrine带给你dbal,位于doctrine本身和PDO之间的库。

如果使用dbal(或更高级别的库),则开始停止思考SQL(以及注入保护等),并开始考虑以可读的PHP代码描述数据库中的内容。

例如:利用其面向对象的接口,构建广泛的where条款成为维护微风(警告:从过去的记忆编写的代码,可能不是字面上正确):

$queryBuilder 
    ->select('id', 'name') 
    ->from('main_employees_summary'); 

if ($x) { 
    $queryBuilder 
     ->andWhere('businessunit_id = ?') 
     ->setParameter(0, $businessunit_id); 
} 

if ($y) { 
    $queryBuilder 
     ->andWhere('department_id = ?') 
     ->setParameter(0, $department_id); 
} 

// ... etc 
0

我们可避免使用$ I如下:

$WHERE = ""; 
if (!empty($businessunit_id)) 
{ 
    $WHERE .= "businessunit_id='{$businessunit_id}' AND "; 
} 

if (!empty($department_id)) 
{ 
    $WHERE .= "department_id='{$department_id}' AND "; 
} 

if (!empty($jobtitle)) 
{ 
    $WHERE .= "jobtitle_id='{$jobtitle}' AND "; 
} 
if ($WHERE) { 
    $WHERE = preg_replace('/AND\s$/', '', $WHERE);//removing the last 'AND ' 
    $query = "SELECT * FROM `main_employees_summary` WHERE $WHERE "; 
    $data = $db->query($query)->fetchAll(); 
} 
return $data; 

或者使用数组

$whereArr = array(); 
if (!empty($businessunit_id)) 
{ 
    $whereArr[] = "businessunit_id='{$businessunit_id}'"; 
} 
//....... 
if (!empty($whereArr)) { 
    $WHERE = implode(' AND ', $whereArr);//joining with ' AND ' 
    $query = "SELECT * FROM `main_employees_summary` WHERE $WHERE "; 
    //..... 
}