From 62a45d34e8daf6f33451fc3b8f50b7a60534ec4c Mon Sep 17 00:00:00 2001 From: Bambang Mohammad Azhari <52351532+illusi03@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:44:19 +0700 Subject: [PATCH] Feature JoinRelationship Flexibility Initial Model #197 --- src/Mixins/JoinRelationship.php | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/Mixins/JoinRelationship.php b/src/Mixins/JoinRelationship.php index 1f83642..521b87c 100644 --- a/src/Mixins/JoinRelationship.php +++ b/src/Mixins/JoinRelationship.php @@ -98,10 +98,12 @@ public function joinRelationship(): Closure bool $useAlias = false, bool $disableExtraConditions = false, ?string $morphable = null, + ?string $initialModel = null, ) { $joinType = JoinsHelper::$joinMethodsMap[$joinType] ?? $joinType; $useAlias = is_string($callback) ? false : $useAlias; - $joinHelper = JoinsHelper::make($this->getModel()); + $currentModel = $initialModel ? (new $initialModel) : $this->getModel(); + $joinHelper = JoinsHelper::make($currentModel); $callback = $joinHelper->formatJoinCallback($callback); $this->getQuery()->beforeQuery(function () use ($joinHelper) { @@ -109,11 +111,19 @@ public function joinRelationship(): Closure }); if (is_null($this->getSelect())) { - $this->select(sprintf('%s.*', $this->getModel()->getTable())); + $this->select(sprintf('%s.*', $currentModel->getTable())); } if (Str::contains($relationName, '.')) { - $this->joinNestedRelationship($relationName, $callback, $joinType, $useAlias, $disableExtraConditions, $morphable); + $this->joinNestedRelationship( + $relationName, + $callback, + $joinType, + $useAlias, + $disableExtraConditions, + $morphable, + $initialModel + ); return $this; } @@ -123,7 +133,7 @@ public function joinRelationship(): Closure $relationCallback = $callback[$relationName]; } - $relation = $this->getModel()->{$relationName}(); + $relation = $currentModel->{$relationName}(); $relationQuery = $relation->getQuery(); $alias = $joinHelper->getAliasName( $useAlias, @@ -151,7 +161,7 @@ public function joinRelationship(): Closure ? "{$aliasString}.{$relationQuery->getModel()->getTable()}.{$relationName}" : "{$relationQuery->getModel()->getTable()}.{$relationName}"; - if ($joinHelper->relationshipAlreadyJoined($this->getModel(), $relationJoinCache)) { + if ($joinHelper->relationshipAlreadyJoined($currentModel, $relationJoinCache)) { return $this; } @@ -159,7 +169,7 @@ public function joinRelationship(): Closure StaticCache::setTableAliasForModel($relation->getModel(), $alias); } - $joinHelper->markRelationshipAsAlreadyJoined($this->getModel(), $relationJoinCache); + $joinHelper->markRelationshipAsAlreadyJoined($currentModel, $relationJoinCache); StaticCache::clear(); $relation->performJoinForEloquentPowerJoins( @@ -259,9 +269,11 @@ public function joinNestedRelationship(): Closure bool $useAlias = false, bool $disableExtraConditions = false, ?string $morphable = null, + ?string $initialModel = null, ) { $relations = explode('.', $relationships); - $joinHelper = JoinsHelper::make($this->getModel()); + $currentModel = $initialModel ? (new $initialModel) : $this->getModel(); + $joinHelper = JoinsHelper::make($currentModel); /** @var Relation */ $latestRelation = null; @@ -270,7 +282,7 @@ public function joinNestedRelationship(): Closure $part[] = $relationName; $fullRelationName = join('.', $part); - $currentModel = $latestRelation ? $latestRelation->getModel() : $this->getModel(); + $currentModel = $latestRelation ? $latestRelation->getModel() : $currentModel; $relation = $currentModel->{$relationName}(); $relationCallback = null; @@ -319,7 +331,7 @@ public function joinNestedRelationship(): Closure StaticCache::setTableAliasForModel($relation->getModel(), $alias); } - if ($joinHelper->relationshipAlreadyJoined($this->getModel(), $relationJoinCache)) { + if ($joinHelper->relationshipAlreadyJoined($currentModel, $relationJoinCache)) { $latestRelation = $relation; continue; @@ -335,7 +347,7 @@ public function joinNestedRelationship(): Closure ); $latestRelation = $relation; - $joinHelper->markRelationshipAsAlreadyJoined($this->getModel(), $relationJoinCache); + $joinHelper->markRelationshipAsAlreadyJoined($currentModel, $relationJoinCache); } StaticCache::clear();