%PDF- %PDF-
Direktori : /home1/lightco1/public_html/lightingrepublic.com.au/libraries/koowa/database/query/ |
Current File : //home1/lightco1/public_html/lightingrepublic.com.au/libraries/koowa/database/query/query.php |
<?php /** * @version $Id$ * @package Koowa_Database * @subpackage Query * @copyright Copyright (C) 2007 - 2012 Johan Janssens. All rights reserved. * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> * @link http://www.nooku.org */ /** * Database Select Class for database select statement generation * * @author Johan Janssens <johan@nooku.org> * @package Koowa_Database * @subpackage Query */ class KDatabaseQuery { /** * Count operation * * @var boolean */ public $count = false; /** * Distinct operation * * @var boolean */ public $distinct = false; /** * The columns * * @var array */ public $columns = array(); /** * The from element * * @var array */ public $from = array(); /** * The join element * * @var array */ public $join = array(); /** * The where element * * @var array */ public $where = array(); /** * The group element * * @var array */ public $group = array(); /** * The having element * * @var array */ public $having = array(); /** * The order element * * @var string */ public $order = array(); /** * The limit element * * @var integer */ public $limit = null; /** * The limit offset element * * @var integer */ public $offset = null; /** * Database connector * * @var object */ protected $_adapter; /** * Table prefix * * @var object */ protected $_prefix; /** * Object constructor * * Can be overloaded/supplemented by the child class * * @param object An optional KConfig object with configuration options. */ public function __construct( KConfig $config ) { //If no config is passed create it if(!isset($config)) $config = new KConfig(); //Initialise the object $this->_initialize($config); //set the model adapter $this->_adapter = $config->adapter; } /** * Initializes the options for the object * * @param object An optional KConfig object with configuration options. */ protected function _initialize(KConfig $config) { $config->append(array( 'adapter' => '', )); } /** * Gets the database adapter for this particular KDatabaseQuery object. * * @return KDatabaseAdapterInterface */ public function getAdapter() { return $this->_adapter; } /** * Set the database adapter for this particular KDatabaseQuery object. * * @param object A KDatabaseAdapterInterface object * @return KDatabaseQuery */ public function setAdapter(KDatabaseAdapterInterface $adapter) { $this->_adapter = $adapter; return $this; } /** * Built a select query * * @param array|string A string or an array of column names * @return KDatabaseQuery */ public function select( $columns = '*') { settype($columns, 'array'); $this->columns = array_unique( array_merge( $this->columns, $columns ) ); return $this; } /** * Built a count query * * @return KDatabaseQuery */ public function count() { $this->count = true; $this->columns = array(); return $this; } /** * Make the query distinct * * @return KDatabaseQuery */ public function distinct() { $this->distinct = true; return $this; } /** * Built the from clause of the query * * @param array|string A string or array of table names * @return KDatabaseQuery */ public function from( $tables ) { settype($tables, 'array'); //The table needle $needle = $this->_adapter->getTableNeedle(); //Prepent the table prefix foreach($tables as &$table) { if(strpos($table, $needle) !== 0) { $table = $needle.$table; } } $this->from = array_unique(array_merge($this->from, $tables)); return $this; } /** * Built the join clause of the query * * @param string The type of join; empty for a plain JOIN, or "LEFT", "INNER", etc. * @param string The table name to join to. * @param string|array Join on this condition. * @return KDatabaseQuery */ public function join($type, $table, $condition) { settype($condition, 'array'); //The table needle $needle = $this->_adapter->getTableNeedle(); if(strpos($table, $needle) !== 0) { $table = $needle.$table; } $this->join[] = array( 'type' => strtoupper($type), 'table' => $table, 'condition' => $condition, ); return $this; } /** * Built the where clause of the query * * @param string The name of the property the constraint applies too, or a SQL function or statement * @param string The comparison used for the constraint * @param string|array The value compared to the property value using the constraint * @param string The where condition, defaults to 'AND' * @return KDatabaseQuery */ public function where( $property, $constraint = null, $value = null, $condition = 'AND' ) { if(!empty($property)) { $where = array(); $where['property'] = $property; if(isset($constraint)) { $constraint = strtoupper($constraint); $condition = strtoupper($condition); $where['constraint'] = $constraint; $where['value'] = $value; } $where['condition'] = count($this->where) ? $condition : ''; //Make sure we don't store the same where clauses twice $signature = md5($property.$constraint.serialize($value)); if(!isset($this->where[$signature])) { $this->where[$signature] = $where; } } return $this; } /** * Built the group clause of the query * * @param array|string A string or array of ordering columns * @return KDatabaseQuery */ public function group( $columns ) { settype($columns, 'array'); //force to an array $this->group = array_unique( array_merge( $this->group, $columns)); return $this; } /** * Built the having clause of the query * * @param array|string A string or array of ordering columns * @return KDatabaseQuery */ public function having( $columns ) { settype($columns, 'array'); //force to an array $this->having = array_unique( array_merge( $this->having, $columns )); return $this; } /** * Build the order clause of the query * * @param array|string A string or array of ordering columns * @param string Either DESC or ASC * @return KDatabaseQuery */ public function order( $columns, $direction = 'ASC' ) { settype($columns, 'array'); //force to an array foreach($columns as $column) { $this->order[] = array( 'column' => $column, 'direction' => $direction ); } return $this; } /** * Built the limit element of the query * * @param integer Number of items to fetch. * @param integer Offset to start fetching at. * @return KDatabaseQuery */ public function limit( $limit, $offset = 0 ) { $this->limit = (int) $limit; $this->offset = (int) $offset; return $this; } /** * Render the query to a string * * @return string The completed query */ public function __toString() { $query = ''; if(!empty($this->columns) || $this->count) { $query = 'SELECT'; if($this->distinct) { $query .= ' DISTINCT'; } if($this->count) { $query .= ' COUNT(*)'; } } if (!empty($this->columns) && ! $this->count) { $columns = array(); foreach($this->columns as $column) { $columns[] = $this->_adapter->quoteName($column); } $query .= ' '.implode(' , ', $columns); } if (!empty($this->from)) { $tables = array(); foreach($this->from as $table) { $tables[] = $this->_adapter->quoteName($table); } $query .= ' FROM '.implode(' , ', $tables); } if (!empty($this->join)) { $joins = array(); foreach ($this->join as $join) { $tmp = ' '; if (! empty($join['type'])) { $tmp .= $join['type'] . ' '; } $tmp .= ' JOIN ' . $this->_adapter->quoteName($join['table']); $tmp .= ' ON (' . implode(' AND ', $this->_adapter->quoteName($join['condition'])) . ')'; $joins[] = $tmp; } $query .= implode(' ', $joins); } if (!empty($this->where)) { $query .= ' WHERE'; foreach($this->where as $where) { if(isset($where['condition'])) { $query .= ' '.$where['condition']; } $query .= ' '. $this->_adapter->quoteName($where['property']); if(isset($where['constraint'])) { $value = $this->_adapter->quoteValue($where['value']); if(in_array($where['constraint'], array('IN', 'NOT IN'))) { $value = ' ( '.$value. ' ) '; } $query .= ' '.$where['constraint'].' '.$value; } } } if (!empty($this->group)) { $columns = array(); foreach($this->group as $column) { $columns[] = $this->_adapter->quoteName($column); } $query .= ' GROUP BY '.implode(' , ', $columns); } if (!empty($this->having)) { $columns = array(); foreach($this->having as $column) { $columns[] = $this->_adapter->quoteName($column); } $query .= ' HAVING '.implode(' , ', $columns); } if (!empty($this->order) ) { $query .= ' ORDER BY '; $list = array(); foreach ($this->order as $order) { $list[] = $this->_adapter->quoteName($order['column']).' '.$order['direction']; } $query .= implode(' , ', $list); } if (!empty($this->limit)) { $query .= ' LIMIT '.$this->offset.' , '.$this->limit; } return $query; } }