From bc92a9614d35fd20df1ce5f1a3d28b90a646013a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Mar=C3=ADa=20G=C3=B3mez?= <43571126+josemariagomez@users.noreply.github.com> Date: Wed, 6 Oct 2021 18:09:52 +0200 Subject: [PATCH] [8.x] Add nested relationships to whereRelation function (#39064) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add nested relationships to whereRelation function * Removed 2 spaces * formatting * Update QueriesRelationships.php Co-authored-by: Jose María Gómez Martín Co-authored-by: Taylor Otwell --- .../Concerns/QueriesRelationships.php | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php b/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php index aae3ffb11860..b49cde632fe6 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php +++ b/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php @@ -362,9 +362,23 @@ public function orWhereDoesntHaveMorph($relation, $types, Closure $callback = nu */ public function whereRelation($relation, $column, $operator = null, $value = null) { - return $this->whereHas($relation, function ($query) use ($column, $operator, $value) { - $query->where($column, $operator, $value); - }); + $relations = collect(explode('.', $relation)); + + return $this->when( + $relations->count() == 1, + function($query) use ($relations, $column, $operator, $value) { + $query->whereHas($relations->first(), function ($query) use ($column, $operator, $value) { + $query->where($column, $operator, $value); + }); + }, + function($query) use ($relations, $column, $operator, $value) { + $query->whereHas($relations->first(), function ($query) use ($relations, $column, $operator, $value) { + $relations->shift(); + + $query->whereRelation($relations->implode('.'), $column, $operator, $value); + }); + } + ); } /** @@ -378,9 +392,23 @@ public function whereRelation($relation, $column, $operator = null, $value = nul */ public function orWhereRelation($relation, $column, $operator = null, $value = null) { - return $this->orWhereHas($relation, function ($query) use ($column, $operator, $value) { - $query->where($column, $operator, $value); - }); + $relations = collect(explode('.', $relation)); + + return $this->when( + $relations->count() == 1, + function($query) use ($relations, $column, $operator, $value) { + $query->orWhereHas($relations->first(), function ($query) use ($column, $operator, $value) { + $query->where($column, $operator, $value); + }); + }, + function($query) use ($relations, $column, $operator, $value) { + $query->orWhereHas($relations->first(), function ($query) use ($relations, $column, $operator, $value) { + $relations->shift(); + + $query->orWhereRelation($relations->implode('.'), $column, $operator, $value); + }); + } + ); } /**