LEFT
JOIN
`b`
ON
`b`.`deleted_at`
IS
NULL
AND
( `a`.`a`
=
`b`.`a`
AND
`a`.`b`
=
`b`.`b`
AND
`a`.`c`
=
`b`.`c` )
OR
( `a`.`a`
=
`b`.`a`
AND
`a`.`b`
=
`b`.`b`
AND
`a`.`d`
=
`b`.`d` )
想用model的方法实现join 的 orOn,百度谷歌过后没有找到合适的资料
官方文档的orOn资料如下:
laravel.com/docs/6.x/qu…
Cross Join Clause
To perform a "cross join" use the crossJoin method with the name of the table you wish to cross join to. Cross joins generate a cartesian product between the first table and the joined table:
$users = DB::table('sizes')
->crossJoin('colors')
->get();
Advanced Join Clauses
You may also specify more advanced join clauses. To get started, pass a Closure as the second argument into the join method. The Closure will receive a JoinClause object which allows you to specify constraints on the join clause:
DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
->get();
这时候只能寻找源码了
先从$join->on开始
文件地址:vendor/laravel/framework/src/Illuminate/Database/Query/JoinClause.php
* AddHoneycombLog 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 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);
* AddHoneycombLog 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');
由上可见,join中的on 可以传递 $boolean = 'or'的
使用on 传递boolean参数 === orOn方法
单where条件
可以通过以下代码实现:
$info = DB::table('table_name')
->leftJoin('table_name2', function ($join) {
$join->on('table_name.a', '=', 'table_name2.a')
->orOn('table_name.b', '=', 'table_name2.b');
})->get();
查看whereColumn方法
文件地址:/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
* AddHoneycombLog a "where" clause comparing two columns to the query.
* @param string|array $first
* @param string|null $operator
* @param string|null $second
* @param string|null $boolean
* @return \Illuminate\Database\Query\Builder|static
public function whereColumn($first, $operator = null, $second = null, $boolean = 'and')
if (is_array($first)) {
return $this->addArrayOfWheres($first, $boolean, 'whereColumn');
if ($this->invalidOperator($operator)) {
[$second, $operator] = [$operator, '='];
$type = 'Column';
$this->wheres[] = compact(
'type', 'first', 'operator', 'second', 'boolean'
return $this;
由is_array可见,是可以传递数组的
多where条件
可以通过以下代码实现:
$info = DB::table('table_name')
->leftJoin('table_name2', function ($join) {
$join->on([
['table_name.a', '=', 'table_name2.a'],
['table_name.b', '=', 'table_name2.b'],
['table_name.c', '=', 'table_name2.c'],
->orOn([
['table_name.a', '=', 'table_name2.a'],
['table_name.b', '=', 'table_name2.b'],
['table_name.d', '=', 'table_name2.d'],
})->get();
上述代码已用model的方式实现了原生sql
laravel leftjoin on orOn的源码剖析就到这了,希望文章可以帮忙解决你的难题,期待你的关注👍