A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			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.
		
		
		
		
		
			
		
			
				
					
					
						
							307 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
	
	
							307 lines
						
					
					
						
							6.3 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * Copyright © 2023 ExacTI Technology Solutions. All rights reserved.
 | 
						|
 * GPLv3 General License.
 | 
						|
 * https://exacti.com.br
 | 
						|
 * Phacil PHP Framework - https://github.com/exacti/phacil-framework
 | 
						|
 */
 | 
						|
 | 
						|
namespace Phacil\Framework\MagiQL\Manipulation;
 | 
						|
 | 
						|
use Phacil\Framework\MagiQL\Syntax\Where;
 | 
						|
use Phacil\Framework\MagiQL\Syntax\Column;
 | 
						|
use Phacil\Framework\MagiQL\Syntax\SyntaxFactory;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class JoinQuery.
 | 
						|
 */
 | 
						|
class JoinQuery
 | 
						|
{
 | 
						|
    const JOIN_LEFT = 'LEFT';
 | 
						|
    const JOIN_RIGHT = 'RIGHT';
 | 
						|
    const JOIN_INNER = 'INNER';
 | 
						|
    const JOIN_CROSS = 'CROSS';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var Where
 | 
						|
     */
 | 
						|
    protected $joinCondition;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var bool
 | 
						|
     */
 | 
						|
    protected $isJoin = false;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $joinType;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $joins = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var Select
 | 
						|
     */
 | 
						|
    protected $select;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param Select $select
 | 
						|
     */
 | 
						|
    public function __construct(Select $select)
 | 
						|
    {
 | 
						|
        $this->select = $select;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $table
 | 
						|
     *
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function setTable($table)
 | 
						|
    {
 | 
						|
        $this->select->setTable($table);
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string   $table
 | 
						|
     * @param mixed    $selfColumn
 | 
						|
     * @param mixed    $refColumn
 | 
						|
     * @param string[] $columns
 | 
						|
     *
 | 
						|
     * @return Select
 | 
						|
     */
 | 
						|
    public function leftJoin($table, $selfColumn = null, $refColumn = null, $columns = [])
 | 
						|
    {
 | 
						|
        return $this->join($table, $selfColumn, $refColumn, $columns, self::JOIN_LEFT);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string   $table
 | 
						|
     * @param mixed    $selfColumn
 | 
						|
     * @param mixed    $refColumn
 | 
						|
     * @param string[] $columns
 | 
						|
     * @param string   $joinType
 | 
						|
     *
 | 
						|
     * @return Select
 | 
						|
     */
 | 
						|
    public function join(
 | 
						|
        $table,
 | 
						|
        $selfColumn = null,
 | 
						|
        $refColumn = null,
 | 
						|
        $columns = [],
 | 
						|
        $joinType = null
 | 
						|
    ) {
 | 
						|
        if (!isset($this->joins[$table])) {
 | 
						|
            $select = QueryFactory::createSelect($table);
 | 
						|
            $select->setColumns($columns);
 | 
						|
            $select->setJoinType($joinType);
 | 
						|
            $select->setParentQuery($this->select);
 | 
						|
            $this->addJoin($select, $selfColumn, $refColumn);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->joins[$table];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param Select $select
 | 
						|
     * @param mixed  $selfColumn
 | 
						|
     * @param mixed  $refColumn
 | 
						|
     *
 | 
						|
     * @return Select
 | 
						|
     */
 | 
						|
    public function addJoin(Select $select, $selfColumn, $refColumn)
 | 
						|
    {
 | 
						|
        $select->isJoin(true);
 | 
						|
        $table = $select->getTable()->getName();
 | 
						|
 | 
						|
        if (!isset($this->joins[$table])) {
 | 
						|
            if (!$selfColumn instanceof Column) {
 | 
						|
                $newColumn = array($selfColumn);
 | 
						|
                $selfColumn = SyntaxFactory::createColumn(
 | 
						|
                    $newColumn,
 | 
						|
                    $this->select->getTable()
 | 
						|
                );
 | 
						|
            }
 | 
						|
 | 
						|
            $select->joinCondition()->equals($refColumn, $selfColumn);
 | 
						|
            $this->joins[$table] = $select;
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->joins[$table];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Transforms Select in a joint.
 | 
						|
     *
 | 
						|
     * @param bool $isJoin
 | 
						|
     *
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function setJoin($isJoin = true)
 | 
						|
    {
 | 
						|
        $this->isJoin = $isJoin;
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string   $table
 | 
						|
     * @param mixed    $selfColumn
 | 
						|
     * @param mixed    $refColumn
 | 
						|
     * @param string[] $columns
 | 
						|
     *
 | 
						|
     * @internal param null $selectClass
 | 
						|
     *
 | 
						|
     * @return Select
 | 
						|
     */
 | 
						|
    public function rightJoin($table, $selfColumn = null, $refColumn = null, $columns = [])
 | 
						|
    {
 | 
						|
        return $this->join($table, $selfColumn, $refColumn, $columns, self::JOIN_RIGHT);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string   $table
 | 
						|
     * @param mixed    $selfColumn
 | 
						|
     * @param mixed    $refColumn
 | 
						|
     * @param string[] $columns
 | 
						|
     *
 | 
						|
     * @return Select
 | 
						|
     */
 | 
						|
    public function crossJoin($table, $selfColumn = null, $refColumn = null, $columns = [])
 | 
						|
    {
 | 
						|
        return $this->join($table, $selfColumn, $refColumn, $columns, self::JOIN_CROSS);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string   $table
 | 
						|
     * @param mixed    $selfColumn
 | 
						|
     * @param mixed    $refColumn
 | 
						|
     * @param string[] $columns
 | 
						|
     *
 | 
						|
     * @return Select
 | 
						|
     */
 | 
						|
    public function innerJoin($table, $selfColumn = null, $refColumn = null, $columns = [])
 | 
						|
    {
 | 
						|
        return $this->join($table, $selfColumn, $refColumn, $columns, self::JOIN_INNER);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Alias to joinCondition.
 | 
						|
     *
 | 
						|
     * @return Where
 | 
						|
     */
 | 
						|
    public function on()
 | 
						|
    {
 | 
						|
        return $this->joinCondition();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * WHERE constrains used for the ON clause of a (LEFT/RIGHT/INNER/CROSS) JOIN.
 | 
						|
     *
 | 
						|
     * @return Where
 | 
						|
     */
 | 
						|
    public function joinCondition()
 | 
						|
    {
 | 
						|
        if (!isset($this->joinCondition)) {
 | 
						|
            $this->joinCondition = QueryFactory::createWhere($this->select);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->joinCondition;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function isJoinSelect()
 | 
						|
    {
 | 
						|
        return $this->isJoin;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function isJoin()
 | 
						|
    {
 | 
						|
        return $this->isJoin;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return \Phacil\Framework\MagiQL\Syntax\Where
 | 
						|
     */
 | 
						|
    public function getJoinCondition()
 | 
						|
    {
 | 
						|
        return $this->joinCondition;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param \Phacil\Framework\MagiQL\Syntax\Where $joinCondition
 | 
						|
     *
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function setJoinCondition($joinCondition)
 | 
						|
    {
 | 
						|
        $this->joinCondition = $joinCondition;
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getJoinType()
 | 
						|
    {
 | 
						|
        return $this->joinType;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $joinType
 | 
						|
     *
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function setJoinType($joinType)
 | 
						|
    {
 | 
						|
        $this->joinType = $joinType;
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getJoins()
 | 
						|
    {
 | 
						|
        return $this->joins;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array $joins
 | 
						|
     *
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function setJoins($joins)
 | 
						|
    {
 | 
						|
        $this->joins = $joins;
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getAllJoins()
 | 
						|
    {
 | 
						|
        $joins = $this->joins;
 | 
						|
 | 
						|
        foreach ($this->joins as $join) {
 | 
						|
            $joins = \array_merge($joins, $join->getAllJoins());
 | 
						|
        }
 | 
						|
 | 
						|
        return $joins;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |