147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?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);
 | 
						|
    }
 | 
						|
}
 |