From e423c52cfe0bcc73cdd822314231f38c34f81d42 Mon Sep 17 00:00:00 2001 From: "Zaid J. Barghouthi" Date: Thu, 10 Apr 2025 22:32:33 +0100 Subject: [PATCH] feat: allow for custom builders in QueriesRelationships closures --- .../Concerns/QueriesRelationships.php | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php b/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php index f9f21536d1fc..ad4c612061fb 100644 --- a/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php +++ b/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php @@ -26,12 +26,13 @@ trait QueriesRelationships * Add a relationship count / exists condition to the query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation * @param string $operator * @param int $count * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder): mixed)|null $callback * @return $this * * @throws \RuntimeException @@ -125,10 +126,11 @@ public function orHas($relation, $operator = '>=', $count = 1) * Add a relationship count / exists condition to the query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder): mixed)|null $callback * @return $this */ public function doesntHave($relation, $boolean = 'and', ?Closure $callback = null) @@ -151,9 +153,10 @@ public function orDoesntHave($relation) * Add a relationship count / exists condition to the query with where clauses. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder): mixed)|null $callback * @param string $operator * @param int $count * @return $this @@ -184,9 +187,10 @@ public function withWhereHas($relation, ?Closure $callback = null, $operator = ' * Add a relationship count / exists condition to the query with where clauses and an "or". * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder): mixed)|null $callback * @param string $operator * @param int $count * @return $this @@ -200,9 +204,10 @@ public function orWhereHas($relation, ?Closure $callback = null, $operator = '>= * Add a relationship count / exists condition to the query with where clauses. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder): mixed)|null $callback * @return $this */ public function whereDoesntHave($relation, ?Closure $callback = null) @@ -214,9 +219,10 @@ public function whereDoesntHave($relation, ?Closure $callback = null) * Add a relationship count / exists condition to the query with where clauses and an "or". * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder): mixed)|null $callback * @return $this */ public function orWhereDoesntHave($relation, ?Closure $callback = null) @@ -228,13 +234,14 @@ public function orWhereDoesntHave($relation, ?Closure $callback = null) * Add a polymorphic relationship count / exists condition to the query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types * @param string $operator * @param int $count * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder) string): mixed)|null $callback * @return $this */ public function hasMorph($relation, $types, $operator = '>=', $count = 1, $boolean = 'and', ?Closure $callback = null) @@ -328,11 +335,12 @@ public function orHasMorph($relation, $types, $operator = '>=', $count = 1) * Add a polymorphic relationship count / exists condition to the query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types * @param string $boolean - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder) string): mixed)|null $callback * @return $this */ public function doesntHaveMorph($relation, $types, $boolean = 'and', ?Closure $callback = null) @@ -356,10 +364,11 @@ public function orDoesntHaveMorph($relation, $types) * Add a polymorphic relationship count / exists condition to the query with where clauses. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder) string): mixed)|null $callback * @param string $operator * @param int $count * @return $this @@ -373,10 +382,11 @@ public function whereHasMorph($relation, $types, ?Closure $callback = null, $ope * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder) string): mixed)|null $callback * @param string $operator * @param int $count * @return $this @@ -390,10 +400,11 @@ public function orWhereHasMorph($relation, $types, ?Closure $callback = null, $o * Add a polymorphic relationship count / exists condition to the query with where clauses. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder) string): mixed)|null $callback * @return $this */ public function whereDoesntHaveMorph($relation, $types, ?Closure $callback = null) @@ -405,10 +416,11 @@ public function whereDoesntHaveMorph($relation, $types, ?Closure $callback = nul * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder, string): mixed)|null $callback + * @param (\Closure(TRelatedModelBuilder) string): mixed)|null $callback * @return $this */ public function orWhereDoesntHaveMorph($relation, $types, ?Closure $callback = null) @@ -420,9 +432,10 @@ public function orWhereDoesntHaveMorph($relation, $types, ?Closure $callback = n * Add a basic where clause to a relationship query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this @@ -461,9 +474,10 @@ public function withWhereRelation($relation, $column, $operator = null, $value = * Add an "or where" clause to a relationship query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this @@ -483,9 +497,10 @@ public function orWhereRelation($relation, $column, $operator = null, $value = n * Add a basic count / exists condition to a relationship query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this @@ -505,9 +520,10 @@ public function whereDoesntHaveRelation($relation, $column, $operator = null, $v * Add an "or where" clause to a relationship query. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this @@ -527,10 +543,11 @@ public function orWhereDoesntHaveRelation($relation, $column, $operator = null, * Add a polymorphic relationship condition to the query with a where clause. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this @@ -546,10 +563,11 @@ public function whereMorphRelation($relation, $types, $column, $operator = null, * Add a polymorphic relationship condition to the query with an "or where" clause. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this @@ -565,10 +583,11 @@ public function orWhereMorphRelation($relation, $types, $column, $operator = nul * Add a polymorphic relationship condition to the query with a doesn't have clause. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this @@ -584,10 +603,11 @@ public function whereMorphDoesntHaveRelation($relation, $types, $column, $operat * Add a polymorphic relationship condition to the query with an "or doesn't have" clause. * * @template TRelatedModel of \Illuminate\Database\Eloquent\Model + * @template TRelatedModelBuilder of \Illuminate\Database\Eloquent\Builder * * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation * @param string|array $types - * @param (\Closure(\Illuminate\Database\Eloquent\Builder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column + * @param (\Closure(TRelatedModelBuilder): mixed)|string|array|\Illuminate\Contracts\Database\Query\Expression $column * @param mixed $operator * @param mixed $value * @return $this