/** * 生成查询条件SQL * @access public * @param mixed $where * @return string */ public function buildWhere($where, $table) { if (empty($where)) { $where = []; } if ($where instanceof Query) { return $this->buildWhere($where->getOptions('where'), $table); } $whereStr = ''; // 获取字段信息 $fields = $this->query->getTableInfo($table, 'fields'); $binds = $this->query->getTableInfo($table, 'bind'); foreach ($where as $key => $val) { $str = []; foreach ($val as $field => $value) { if ($fields && in_array($field, $fields, true) && is_scalar($value) && !$this->query->isBind($field)) { $this->query->bind($field, $value, isset($binds[$field]) ? $binds[$field] : PDO::PARAM_STR); $value = ':' . $field; } if ($value instanceof \Closure) { // 使用闭包查询 $query = new Query($this->connection); call_user_func_array($value, [&$query]); $str[] = ' ' . $key . ' ( ' . $this->buildWhere($query->getOptions('where'), $table) . ' )'; } else { if (strpos($field, '|')) { // 不同字段使用相同查询条件(OR) $array = explode('|', $field); $item = []; foreach ($array as $k) { $item[] = $this->parseWhereItem($k, $value); } $str[] = ' ' . $key . ' ( ' . implode(' OR ', $item) . ' )'; } elseif (strpos($field, '&')) { // 不同字段使用相同查询条件(AND) $array = explode('&', $field); $item = []; foreach ($array as $k) { $item[] = $this->parseWhereItem($k, $value); } $str[] = ' ' . $key . ' ( ' . implode(' AND ', $item) . ' )'; } else { // 对字段使用表达式查询 $field = is_string($field) ? $field : ''; $str[] = ' ' . $key . ' ' . $this->parseWhereItem($field, $value, $key); } } } $whereStr .= empty($whereStr) ? substr(implode(' ', $str), strlen($key) + 1) : implode(' ', $str); } return $whereStr; }
/** * 生成查询条件SQL * @access public * @param mixed $where * @param array $options * @return string */ public function buildWhere($where, $options) { if (empty($where)) { $where = []; } if ($where instanceof Query) { return $this->buildWhere($where->getOptions('where'), $options); } $whereStr = ''; $binds = $this->query->getFieldsBind($options); foreach ($where as $key => $val) { $str = []; foreach ($val as $field => $value) { if ($value instanceof \Closure) { // 使用闭包查询 $query = new Query($this->connection); call_user_func_array($value, [&$query]); $str[] = ' ' . $key . ' ( ' . $this->buildWhere($query->getOptions('where'), $options) . ' )'; } elseif (strpos($field, '|')) { // 不同字段使用相同查询条件(OR) $array = explode('|', $field); $item = []; foreach ($array as $k) { $item[] = $this->parseWhereItem($k, $value, '', $options, $binds); } $str[] = ' ' . $key . ' ( ' . implode(' OR ', $item) . ' )'; } elseif (strpos($field, '&')) { // 不同字段使用相同查询条件(AND) $array = explode('&', $field); $item = []; foreach ($array as $k) { $item[] = $this->parseWhereItem($k, $value, '', $options, $binds); } $str[] = ' ' . $key . ' ( ' . implode(' AND ', $item) . ' )'; } else { // 对字段使用表达式查询 $field = is_string($field) ? $field : ''; $str[] = ' ' . $key . ' ' . $this->parseWhereItem($field, $value, $key, $options, $binds); } } $whereStr .= empty($whereStr) ? substr(implode(' ', $str), strlen($key) + 1) : implode(' ', $str); } return $whereStr; }