diff --git a/framework/yii/db/oci/QueryBuilder.php b/framework/yii/db/oci/QueryBuilder.php new file mode 100644 index 0000000..3ee27f1 --- /dev/null +++ b/framework/yii/db/oci/QueryBuilder.php @@ -0,0 +1,75 @@ + + * @since 2.0 + */ +class QueryBuilder extends \yii\db\QueryBuilder { + + private $sql; + + public function build($query) { + //var_dump($query);exit; + $params = $query->params; + $clauses = [ + $this->buildSelect($query->select, $query->distinct, $query->selectOption), + $this->buildFrom($query->from), + $this->buildJoin($query->join, $params), + $this->buildWhere($query->where, $params), + $this->buildGroupBy($query->groupBy), + $this->buildHaving($query->having, $params), + $this->buildUnion($query->union, $params), + $this->buildOrderBy($query->orderBy), + //$this->buildLimit($query->limit, $query->offset), + ]; + //var_dump( [implode($this->separator, array_filter($clauses)), $params]);exit; + $this->sql = implode($this->separator, array_filter($clauses)); + + if (!is_null($query->limit) && !is_null($query->offset)) { + $this->sql = $this->buildLimit($query->limit, $query->offset); + } + return [$this->sql, $params]; + //return [implode($this->separator, array_filter($clauses)), $params]; + } + + public function buildLimit($limit, $offset) { + //var_dump($limit >= 0); + //var_dump($offset);exit; + //var_dump($limit, $offset); + if (($limit < 0) && ($offset < 0)) { + return $this->sql; + } + $filters = array(); + if ($offset > 0) { + $filters[] = 'rowNumId > ' . (int) $offset; + } + + if ($limit >= 0) { + $filters[] = 'rownum <= ' . (int) $limit; + } + + if (count($filters) > 0) { + $filter = implode(' and ', $filters); + $filter = " WHERE " . $filter; + } else { + $filter = ''; + } + + $sql = <<sql}), + PAGINATION AS (SELECT USER_SQL.*, rownum as rowNumId FROM USER_SQL) +SELECT * +FROM PAGINATION +{$filter} +EOD; + return $sql; + } + +}