123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- <?php
- /**
- * Database query builder for JOIN statements. See [Query Builder](/database/query/builder) for usage and examples.
- *
- * @package Kohana/Database
- * @category Query
- * @author Kohana Team
- * @copyright (c) Kohana Team
- * @license https://koseven.ga/LICENSE.md
- */
- class Kohana_Database_Query_Builder_Join extends Database_Query_Builder {
- // Type of JOIN
- protected $_type;
- // JOIN ...
- protected $_table;
- // ON ...
- protected $_on = [];
- // USING ...
- protected $_using = [];
- /**
- * Creates a new JOIN statement for a table. Optionally, the type of JOIN
- * can be specified as the second parameter.
- *
- * @param mixed $table column name or array($column, $alias) or object
- * @param string $type type of JOIN: INNER, RIGHT, LEFT, etc
- * @return void
- */
- public function __construct($table, $type = NULL)
- {
- // Set the table to JOIN on
- $this->_table = $table;
- if ($type !== NULL)
- {
- // Set the JOIN type
- $this->_type = (string) $type;
- }
- }
- /**
- * Adds a new condition for joining.
- *
- * @param mixed $c1 column name or array($column, $alias) or object
- * @param string $op logic operator
- * @param mixed $c2 column name or array($column, $alias) or object
- * @return $this
- */
- public function on($c1, $op, $c2)
- {
- if ( ! empty($this->_using))
- {
- throw new Kohana_Exception('JOIN ... ON ... cannot be combined with JOIN ... USING ...');
- }
- $this->_on[] = [$c1, $op, $c2];
- return $this;
- }
- /**
- * Adds a new condition for joining.
- *
- * @param string $columns column name
- * @return $this
- */
- public function using($columns)
- {
- if ( ! empty($this->_on))
- {
- throw new Kohana_Exception('JOIN ... ON ... cannot be combined with JOIN ... USING ...');
- }
- $columns = func_get_args();
- $this->_using = array_merge($this->_using, $columns);
- return $this;
- }
- /**
- * Compile the SQL partial for a JOIN statement and return it.
- *
- * @param mixed $db Database instance or name of instance
- * @return string
- */
- public function compile($db = NULL)
- {
- if ( ! is_object($db))
- {
- // Get the database instance
- $db = Database::instance($db);
- }
- if ($this->_type)
- {
- $sql = strtoupper($this->_type).' JOIN';
- }
- else
- {
- $sql = 'JOIN';
- }
- // Quote the table name that is being joined
- $sql .= ' '.$db->quote_table($this->_table);
- if ( ! empty($this->_using))
- {
- // Quote and concat the columns
- $sql .= ' USING ('.implode(', ', array_map([$db, 'quote_column'], $this->_using)).')';
- }
- else
- {
- $conditions = [];
- foreach ($this->_on as $condition)
- {
- // Split the condition
- list($c1, $op, $c2) = $condition;
- if ($op)
- {
- // Make the operator uppercase and spaced
- $op = ' '.strtoupper($op);
- }
- // Quote each of the columns used for the condition
- $conditions[] = $db->quote_column($c1).$op.' '.$db->quote_column($c2);
- }
- // Concat the conditions "... AND ..."
- $sql .= ' ON ('.implode(' AND ', $conditions).')';
- }
- return $sql;
- }
- public function reset()
- {
- $this->_type =
- $this->_table = NULL;
- $this->_on = [];
- }
- } // End Database_Query_Builder_Join
|