You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.1 KiB
78 lines
2.1 KiB
<?php |
|
namespace yii\db\oci; |
|
|
|
use yii\db\Exception; |
|
use yii\base\InvalidParamException; |
|
|
|
/** |
|
* QueryBuilder is the query builder for Oracle databases. |
|
* |
|
*/ |
|
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 = <<<EOD |
|
WITH USER_SQL AS ({$this->sql}), |
|
PAGINATION AS (SELECT USER_SQL.*, rownum as rowNumId FROM USER_SQL) |
|
SELECT * |
|
FROM PAGINATION |
|
{$filter} |
|
EOD; |
|
return $sql; |
|
} |
|
}
|
|
|