Compiles an array of conditions into an SQL partial. Used for WHERE and HAVING.
string Driver_Database_Driver_Mongo::_compile_conditions( object $conditions , array $parameters )
参数列表
参数 类型 描述 默认值 $conditions
object
Database instance $parameters
array
Condition statements
string
protected function _compile_conditions(array $conditions, $parameters)
{
$last_logic = '$and';
$tmp_query_list = array();
$query = array();
$tmp_query = & $query;
$condition_num = 0;
$multikey_mod = false; //同字段多条件模式,适用于$or和$and条件
foreach ($conditions as $group)
{
foreach ($group as $logic => $condition)
{
$logic = '$'.strtolower($logic); //$or,$and
if ($condition === '(')
{
$tmp_query_list[] = array(); //增加一行数据
unset($tmp_query); //删除引用关系,这样数据就保存在了$tmp_query_list里
$tmp_query =& $tmp_query_list[count($tmp_query_list)-1]; //把指针移动到新的组里
$last_logic_list[] = $last_logic; //放一个备份
$last_logic = '$and'; //新组开启,把$last_logic设置成$and
}
elseif ($condition === ')')
{
# 关闭一个组
$last_logic = array_pop($last_logic_list); //恢复上一个$last_logic
# 将最后一个移除
$tmp_query2 = array_pop($tmp_query_list);
$c = count($tmp_query_list);
unset($tmp_query);
if ($c)
{
$tmp_query =& $tmp_query_list[$c-1];
}
else
{
$tmp_query =& $query;
}
Database_Driver_Mongo::_compile_paste_data($tmp_query , $tmp_query2 , $last_logic , $logic);
unset($tmp_query2,$c);
}
else
{
list ($column, $op, $value) = $condition;
$tmp_option = Database_Driver_Mongo::_compile_set_data($op, $value , $parameters);
Database_Driver_Mongo::_compile_paste_data($tmp_query, $tmp_option , $last_logic , $logic ,$column);
$last_logic = $logic;
}
}
}
return $query;
}