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;
|
|
}
|
|
}
|
|
|