147 lines
3.6 KiB
PHP
147 lines
3.6 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Illuminate\Database\Query;
|
||
|
|
||
|
use Closure;
|
||
|
|
||
|
class JoinClause extends Builder
|
||
|
{
|
||
|
/**
|
||
|
* The type of join being performed.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $type;
|
||
|
|
||
|
/**
|
||
|
* The table the join clause is joining to.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
public $table;
|
||
|
|
||
|
/**
|
||
|
* The connection of the parent query builder.
|
||
|
*
|
||
|
* @var \Illuminate\Database\ConnectionInterface
|
||
|
*/
|
||
|
protected $parentConnection;
|
||
|
|
||
|
/**
|
||
|
* The grammar of the parent query builder.
|
||
|
*
|
||
|
* @var \Illuminate\Database\Query\Grammars\Grammar
|
||
|
*/
|
||
|
protected $parentGrammar;
|
||
|
|
||
|
/**
|
||
|
* The processor of the parent query builder.
|
||
|
*
|
||
|
* @var \Illuminate\Database\Query\Processors\Processor
|
||
|
*/
|
||
|
protected $parentProcessor;
|
||
|
|
||
|
/**
|
||
|
* The class name of the parent query builder.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $parentClass;
|
||
|
|
||
|
/**
|
||
|
* Create a new join clause instance.
|
||
|
*
|
||
|
* @param \Illuminate\Database\Query\Builder $parentQuery
|
||
|
* @param string $type
|
||
|
* @param string $table
|
||
|
* @return void
|
||
|
*/
|
||
|
public function __construct(Builder $parentQuery, $type, $table)
|
||
|
{
|
||
|
$this->type = $type;
|
||
|
$this->table = $table;
|
||
|
$this->parentClass = get_class($parentQuery);
|
||
|
$this->parentGrammar = $parentQuery->getGrammar();
|
||
|
$this->parentProcessor = $parentQuery->getProcessor();
|
||
|
$this->parentConnection = $parentQuery->getConnection();
|
||
|
|
||
|
parent::__construct(
|
||
|
$this->parentConnection, $this->parentGrammar, $this->parentProcessor
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add an "on" clause to the join.
|
||
|
*
|
||
|
* On clauses can be chained, e.g.
|
||
|
*
|
||
|
* $join->on('contacts.user_id', '=', 'users.id')
|
||
|
* ->on('contacts.info_id', '=', 'info.id')
|
||
|
*
|
||
|
* will produce the following SQL:
|
||
|
*
|
||
|
* on `contacts`.`user_id` = `users`.`id` and `contacts`.`info_id` = `info`.`id`
|
||
|
*
|
||
|
* @param \Closure|string $first
|
||
|
* @param string|null $operator
|
||
|
* @param \Illuminate\Database\Query\Expression|string|null $second
|
||
|
* @param string $boolean
|
||
|
* @return $this
|
||
|
*
|
||
|
* @throws \InvalidArgumentException
|
||
|
*/
|
||
|
public function on($first, $operator = null, $second = null, $boolean = 'and')
|
||
|
{
|
||
|
if ($first instanceof Closure) {
|
||
|
return $this->whereNested($first, $boolean);
|
||
|
}
|
||
|
|
||
|
return $this->whereColumn($first, $operator, $second, $boolean);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add an "or on" clause to the join.
|
||
|
*
|
||
|
* @param \Closure|string $first
|
||
|
* @param string|null $operator
|
||
|
* @param string|null $second
|
||
|
* @return \Illuminate\Database\Query\JoinClause
|
||
|
*/
|
||
|
public function orOn($first, $operator = null, $second = null)
|
||
|
{
|
||
|
return $this->on($first, $operator, $second, 'or');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a new instance of the join clause builder.
|
||
|
*
|
||
|
* @return \Illuminate\Database\Query\JoinClause
|
||
|
*/
|
||
|
public function newQuery()
|
||
|
{
|
||
|
return new static($this->newParentQuery(), $this->type, $this->table);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a new query instance for sub-query.
|
||
|
*
|
||
|
* @return \Illuminate\Database\Query\Builder
|
||
|
*/
|
||
|
protected function forSubQuery()
|
||
|
{
|
||
|
return $this->newParentQuery()->newQuery();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a new parent query instance.
|
||
|
*
|
||
|
* @return \Illuminate\Database\Query\Builder
|
||
|
*/
|
||
|
protected function newParentQuery()
|
||
|
{
|
||
|
$class = $this->parentClass;
|
||
|
|
||
|
return new $class($this->parentConnection, $this->parentGrammar, $this->parentProcessor);
|
||
|
}
|
||
|
}
|