选择语言 :

 Driver_Database_Driver_Mongo::compile

构建SQL语句

null Driver_Database_Driver_Mongo::compile( )
File: ./drivers/database/mongo/mongo.class.php
public function compile($builder, $type = 'selete')
{
    $where = array();
    if (! empty($builder['where']))
    {
        $where = $this->_compile_conditions($builder['where'], $builder['parameters']);
    }

    if ($type=='insert')
    {
        $sql = array
        (
            'type'    => 'insert',
            'table'   => $builder['table'],
            'options' => array
            (
                'safe' => true,
            ),
        );

        if (count($builder['values'])>1)
        {
            # 批量插入
            $sql['type'] = 'batchinsert';

            foreach ($builder['columns'] as $field)
            {
                foreach ($builder['values'] as $k=>$v)
                {
                    $data[$k][$field] = $builder['values'][$k][$field];
                }
            }
            $sql['data'] = $data;
        }
        else
        {
            # 单条插入
            foreach ($builder['columns'] as $field)
            {
                $data[$field] = $builder['values'][0][$field];
            }
            $sql['data'] = $data;
        }
    }
    elseif ($type == 'update')
    {
        $sql = array
        (
            'type'    => 'update',
            'table'   => $builder['table'],
            'where'   => $where,
            'options' => array
            (
                'multiple' => true,
                'safe'     => true,
            ),
        );
        foreach ($builder['set'] as $item)
        {
            if ($item[2]=='+')
            {
                $op = '$inc';
            }
            elseif  ($item[2]=='-')
            {
                $item[1] = - $item[1];
                $op = '$inc';
            }
            else
            {
                $op = '$set';
            }
            $sql['data'][$op][$item[0]] = $item[1];
        }
    }
    elseif ($type == 'delete')
    {
        $sql = array
        (
            'type'    => 'remove',
            'table'   => $builder['table'],
            'where'   => $where,
        );
    }
    else
    {
        $sql = array
        (
            'type'  => $type,
            'table' => $builder['from'][0],
            'where' => $where,
            'limit' => $builder['limit'],
            'skip'  => $builder['offset'],
        );

        if ($builder['distinct'])
        {
            $sql['distinct'] = $builder['distinct'];
        }

        // 查询
        if ($builder['select'])
        {
            foreach ($builder['select'] as $item)
            {
                if (is_string($item))
                {
                    $item = trim($item);
                    if (preg_match('#^(.*) as (.*)$#i', $item , $m))
                    {
                        $s[$m[1]] = $m[2];
                        $sql['select_as'][$m[1]] = $m[2];
                    }
                    else
                    {
                        $s[$item] = 1;
                    }
                }
                elseif (is_object($item))
                {
                    if ($item instanceof Database_Expression)
                    {
                        $v = $item->value();
                        if ($v==='COUNT(1) AS `total_row_count`')
                        {
                            $sql['total_count'] = true;
                        }
                        else
                        {
                            $s[$v] = 1;
                        }
                    }
                    elseif (method_exists($item, '__toString'))
                    {
                        $s[(string)$item] = 1;
                    }
                }
            }

            $sql['select'] = $s;
        }

        // 排序
        if ($builder['order_by'])
        {
            foreach ($builder['order_by'] as $item)
            {
                $sql['sort'][$item[0]] = $item[1]=='DESC'?-1:1;
            }
        }

        // group by
        if ($builder['group_by'])
        {
            $sql['group_by'] = $builder['group_by'];
        }

        // 高级查询条件
        if ($builder['select_adv'])
        {
            $sql['select_adv'] = $builder['select_adv'];

            // 分组统计
            if (!$builder['group_by'])
            {
                $sql['group_by'] = array('0');
            }
        }

    }

    return $sql;
}