Driver_Database_Driver_Mongo::_compile_paste_data
null Driver_Database_Driver_Mongo::_compile_paste_data( )
File: ./drivers/database/mongo/mongo.class.php
protected static function _compile_paste_data(&$tmp_query , $tmp_option , $last_logic , $now_logic , $column=null)
{
if ($last_logic!= $now_logic)
{
// 当$and $or 不一致时,则把前面所有的条件合并为一条组成一个$and|$or的条件
if ($column)
{
$tmp_query = array($now_logic => $tmp_query ? array($tmp_query, array($column=>$tmp_option)) : array(array($column=>$tmp_option)));
}
else
{
$tmp_query = array($now_logic => $tmp_query ? array($tmp_query, $tmp_option) : array($tmp_option));
}
}
elseif (isset($tmp_query[$now_logic]))
{
// 如果有 $and $or 条件,则加入
if (is_array($tmp_option) || !$column)
{
$tmp_query[$now_logic][] = $tmp_option;
}
else
{
$tmp_query[$now_logic][] = array($column=>$tmp_option);
}
}
else if ($column)
{
if (isset($tmp_query[$column]))
{
// 如果有相应的字段名,注,这里面已经不可能$logic=='$or'了
if (is_array($tmp_option) && is_array($tmp_query[$column]))
{
// 用于合并类似 $tmp_query = array('field_1'=>array('$lt'=>1));
// $tmp_option = array('field_1'=>array('$gt'=>10)); 这种情况
// 最后的合并结果就是 array('field_1'=>array('$lt'=>1,'$gt'=>10));
$need_reset = false;
foreach ($tmp_option as $tmpk => $tmpv)
{
if (isset($tmp_query[$column][$tmpk]))
{
$need_reset = true;
break;
}
}
if ($need_reset)
{
$tmp_query_bak = $tmp_query; // 给一个数据copy
$tmp_query = array('$and' => array()); // 清除$tmp_query
// 将条件全部加入$and里
foreach ($tmp_query_bak as $tmpk => $tmpv)
{
$tmp_query['$and'][] = array($tmpk => $tmpv);
}
unset($tmp_query_bak);
// 新增加的条件也加入进去
foreach ($tmp_option as $tmpk => $tmpv)
{
$tmp_query['$and'][] = array($column=>array($tmpk => $tmpv));
}
}
else
{
// 无需重新设置数据则合并
foreach ($tmp_option as $tmpk => $tmpv)
{
$tmp_query[$column][$tmpk] = $tmpv;
}
}
}
else
{
$tmp_query['$and'] = array
(
array($column => $tmp_query[$column]),
array($column => $tmp_option),
);
unset($tmp_query[$column]);
}
}
else
{
// 直接加入字段条件
$tmp_query[$column] = $tmp_option;
}
}
else
{
$tmp_query = array_merge($tmp_query,$tmp_option);
}
return $tmp_query;
}