有什么更好的解决方法。
我有一个包含三个可选参数的函数(businessunit_id,department_id,jobtitle)。我必须根据接收参数构建动态 WHERE SQL子句。
代码
var array1 = [0, 1, 2, 3, 4, 5, 6];
var array2 = [7, 8, 1, 2, 9, 10];
var duplicateRemoved = [];
/* run a function for every value in array2 and collect the unique value in a new array */
array2.forEach(function(currentValue, index, arr){
if (array1.indexOf(currentValue) === -1) {
duplicateRemoved.push(currentValue);
}
});
console.log(duplicateRemoved)
在上面的代码中。要构建 WHERE 条件,我正在汇总 $ WHERE 变量并使用 $ i 变量来跟踪需要的 AND 条件。
是否有任何优化方法可以实现这一目标?
答案 0 :(得分:1)
是否有任何优化方法可以实现这一目标?
我将其解释为“更易于维护,更易于阅读”而非“性能优化” - 基于更广泛问题的背景。
这种代码是我鼓励其他程序员使用数据库抽象库的80%的原因。性能成本很少会影响代码清洁度。
看起来你并没有使用PHP框架,所以我猜你可能还没有使用composer
。我建议将其介绍给您的项目,然后使用它来引入数据抽象,如doctrine
或eloquent
。
您可以在SO上找到大量有关使用这些库和工具的帮助。
doctrine
为您dbal
提供了一个位于doctrine
本身和PDO
之间的图书馆。
如果使用dbal
(或更高级别的库),您将开始停止考虑SQL(和注入保护等),并开始考虑用可读的PHP代码从数据库中描述您想要的内容。 / p>
例如:使用面向对象的界面,构建广泛的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
答案 1 :(得分: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 ";
//.....
}