3 namespace DataAccess\Queries
;
5 use DataAccess\Queries\IQueryBuilder
;
7 class QueryBuilder
implements IQueryBuilder
9 private $_queryString = 'SELECT * FROM %s';
11 protected $_whereClauses = array();
12 protected $_limitClause;
13 protected $_joinClauses = array();
14 protected $_orderClause;
15 protected $_countClause;
16 protected $_groupClause;
18 public function buildQuery()
20 $this->applyJoinClauses()
27 return $this->_queryString
;
30 public function setBaseQuery($baseQuery)
32 $this->_queryString
= $baseQuery;
35 public function where($columnName, $operator, $value)
37 $this->_whereClauses
[] = array('columnName' => $columnName, 'operator' => $operator, 'value' => $value);
41 public function limit($start, $end = null
)
45 $this->_limitClause
= sprintf(' LIMIT %u,%u', $start, $end);
49 $this->_limitClause
= sprintf(' LIMIT %u', $start);
54 public function join($type, $tableA, $columnA, $tableB, $columnB)
56 $this->_joinClauses
[] = sprintf(' %s JOIN %s ON %s.%s = %s.%s', $type, $tableB, $tableA, $columnA, $tableB, $columnB);
60 public function null($columnName)
62 return $this->where($columnName, 'is', null
);
65 public function count($column, $as = null
)
69 $this->_countClause
= sprintf(', count(%s) as %s', $column, $as);
71 $this->_countClause
= sprintf(', count(%s)', $column);
77 public function group($column)
79 $this->_groupClause
= sprintf(' group by %s', $column);
84 private function applyCountClause()
86 $pos = strpos($this->_queryString
, '*')+
1;
87 $this->_queryString
= substr_replace($this->_queryString
, $this->_countClause
, $pos, 0);
92 private function applyGroupClause()
94 $this->_queryString
.= $this->_groupClause
;
99 private function applyJoinClauses()
101 foreach($this->_joinClauses
as $joinClause)
103 $this->_queryString
.= $joinClause;
109 public function orderBy($column, $direction)
111 $this->_orderClause
= sprintf(' ORDER BY %s %s', $column, $direction);
116 private function applyWhereClauses()
118 if(!$this->_whereClauses
) return $this;
120 $this->_queryString
.= ' WHERE ';
122 foreach($this->_whereClauses
as $whereClause)
124 switch(gettype($whereClause['value']))
127 $this->_queryString
.= sprintf("%s%s%u", $whereClause['columnName'], $whereClause['operator'], $whereClause['value']) . ' AND ';
130 $this->_queryString
.= sprintf("%s %s '%s'", $whereClause['columnName'], $whereClause['operator'], $whereClause['value']) . ' AND ';
133 $this->_queryString
.= sprintf("%s is null", $whereClause['columnName']) . ' AND ';
139 $this->_queryString
= rtrim($this->_queryString
, ' AND ');
143 private function applyLimitClause()
145 $this->_queryString
.= $this->_limitClause
;
149 private function applyOrderClause()
151 $this->_queryString
.= $this->_orderClause
;