* @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; } }