Think/Model.php
protected function _parseOptions(array $options = [])
    {
        if (is_array($options)) {
            $options = array_merge($this->options, $options);
        }

        if (!isset($options['table'])) {
            // 自动获取表名
            $options['table'] = $this->getTableName();
            $fields = $this->fields;
        } else {
            // 指定数据表 则重新获取字段列表 但不支持类型检测
            $fields = $this->getDbFields();
        }

        // 数据表别名
        if (!empty($options['alias'])) {
            $options['table'] .= ' '.$options['alias'];
        }
        // 记录操作的模型名称
        $options['model'] = $this->name;

        // 字段类型验证
        if (isset($options['where']) && is_array(
                $options['where']
            ) && !empty($fields) && !isset($options['join'])
        ) {
            // 对数组查询条件进行字段类型检查
            foreach ($options['where'] as $key => $val) {
                $key = trim($key);
                if (in_array($key, $fields, true)) {
                    if (is_scalar($val)) {
                        $this->_parseType($options['where'], $key);
                    }
                } elseif (!is_numeric($key) && '_' != substr($key, 0, 1) && false === strpos(
                        $key,
                        '.'
                    ) && false === strpos($key, '(') && false === strpos($key, '|') && false === strpos($key, '&')
                ) {
                    if (!empty($this->options['strict'])) {
                        throw new BaseException(L('_ERROR_QUERY_EXPRESS_').':['.$key.'=>'.$val.']');
                    }
                    unset($options['where'][$key]);
                }
            }
        }
        // 查询过后清空sql表达式组装 避免影响下次查询
        $this->options = [];
        // 表达式过滤
        $this->_options_filter($options);

        return $options;
    }
protected function _parseOptions(array $options = [])
    {
        if (is_array($options)) {
            $options = array_merge($this->options, $options);
        }

        if (!isset($options['table'])) {
            // 自动获取表名
            $options['table'] = $this->getTableName();
            $fields = $this->fields;
        } else {
            // 指定数据表 则重新获取字段列表 但不支持类型检测
            $fields = $this->getDbFields();
        }

        // 数据表别名
        if (!empty($options['alias'])) {
            $options['table'] .= ' '.$options['alias'];
        }
        // 记录操作的模型名称
        $options['model'] = $this->name;

        // 字段类型验证
        if (isset($options['where']) && is_array(
                $options['where']
            ) && !empty($fields) && !isset($options['join'])
        ) {
            // 对数组查询条件进行字段类型检查
            foreach ($options['where'] as $key => $val) {
                $key = trim($key);
                if (in_array($key, $fields, true)) {
                    if (is_scalar($val)) {
                        $this->_parseType($options['where'], $key);
                    }
                } elseif (!is_numeric($key) && '_' != substr($key, 0, 1) && false === strpos(
                        $key,
                        '.'
                    ) && false === strpos($key, '(') && false === strpos($key, '|') && false === strpos($key, '&')
                ) {
                    if (!empty($this->options['strict'])) {
                        throw new BaseException(L('_ERROR_QUERY_EXPRESS_').':['.$key.'=>'.$val.']');
                    }
                    unset($options['where'][$key]);
                }
            }
        }
        // 查询过后清空sql表达式组装 避免影响下次查询
        $this->options = [];
        // 表达式过滤
        $this->_options_filter($options);

        return $options;
    }
分析表达式
@param array $options 表达式参数
@return array
@throws BaseException