如何为PHP数组构建类似Criterion(就像我们对Hibernate(Java)的过滤)?
小解释
这里我构建了一个基本的“Criterion”对象来动态地为SQL字符串语句添加条件,就像这样(select *
只是一个示例,为了简单起见):
public function GetAll($where_hashmap = null, Closure $optionalFn = null)
{
// function that retrieve table name from concrete class implementation
$table = $this->getTableName();
$sql = "select * from {$table}";
$params = array();
if ($where_hashmap != null)
{
$sql .= " where 1=1";
for ($i = 0; $i < count($where_hashmap); $i++)
{
$column = $where_hashmap[$i]["column"];
$logic = $where_hashmap[$i]["logic"]; // AND, OR, NOT, ...
$comparator = $where_hashmap[$i]["comparator"]; // <, <=, >, >=, =, !=, IN ...
$value = $where_hashmap[$i]["value"];
$sql .= " {$logic} {$column} {$comparator} ? "; // i.e. AND column <= ?
array_push($params, $value);
}
}
// function that take the SQL statement, parameters and an optional function,
// prepare and execute the statement
return $this->Query($sql, $params, $optionalFn);
}
这有点简单,因为我们正在为SQL字符串动态添加条件。但现在,我需要对内存数组执行此操作。 PHP的array_filter()
函数在“我们自己编程”回调(条件)函数(如下面的示例,来自docs)
array_filter($arr, function($v, $k) {
return $k == 'b' || $v == 4; // all our criteria from $where_hashmap should be here
}, ARRAY_FILTER_USE_BOTH);
如果不对逻辑关系操作和关系操作的所有可能情况进行硬编码,我怎么能动态地构建if
语句?我应该在运行时在PHP文件中编写一个函数吗?这种方法是否可以扩展?
提前谢谢!