select = is_array($select) ? $select : array($select); if($from) $this->from = is_array($from) ? $from : array(str_replace('`','',$from) => $from); if($where) $this->where = is_array($where) ? $where : array($where); $this->orderby = $orderby; if($groupby) $this->groupby = is_array($groupby) ? $groupby : array($groupby); if($having) $this->having = is_array($having) ? $having : array($having); $this->limit = $limit; parent::__construct(); } /** * Swap the use of one table with another. * @param string $old Name of the old table. * @param string $new Name of the new table. */ function renameTable($old, $new) { $this->replaceText("`$old`", "`$new`"); } /** * Swap some text in the SQL query with another. * @param string $old The old text. * @param string $new The new text. */ function replaceText($old, $new) { if($this->select) foreach($this->select as $i => $item) $this->select[$i] = str_replace($old, $new, $item); if($this->from) foreach($this->from as $i => $item) $this->from[$i] = str_replace($old, $new, $item); if($this->where) { foreach($this->where as $i => $item) $this->where[$i] = str_replace($old, $new, $item); } $this->orderby = str_replace($old, $new, $this->orderby); if($this->groupby) { foreach($this->groupby as $i => $item) $this->groupby[$i] = str_replace($old, $new, $item); } if($this->having) { foreach($this->having as $i => $item) $this->having[$i] = str_replace($old, $new, $item); } } /** * Generate the SQL statement for this query. * @return string */ function sql() { $distinct = $this->distinct ? "DISTINCT " : ""; if($this->select) { $text = "SELECT $distinct" . implode(", ", $this->select); } else { if($this->delete) $text = "DELETE "; } $text .= " FROM " . implode(" ", $this->from); if($this->where) $text .= " WHERE (" . implode(") AND (" , $this->where) . ")"; if($this->groupby) $text .= " GROUP BY " . implode(", ", $this->groupby); if($this->having) $text .= " HAVING ( " . implode(" ) AND ( ", $this->having) . " )"; if($this->orderby) $text .= " ORDER BY " . $this->orderby; if($this->limit) $text .= " LIMIT " . $this->limit; return $text; } /** * Execute this query. * @return Query */ function execute() { return DB::query($this->sql()); } /// VARIOUS TRANSFORMATIONS BELOW /** * Return the number of rows in this query if the limit were removed. Useful in paged data sets. * @return int * * TODO Respect HAVING and GROUPBY, which can affect the result-count */ function unlimitedRowCount( $column = "*" ) { $clone = clone $this; $clone->select = array("count($column)"); $clone->limit = null; $clone->orderby = null; $clone->groupby = null; return $clone->execute()->value(); } } ?>