From 3a9bf7126f7746406170fe38300cf2bd1588cf89 Mon Sep 17 00:00:00 2001 From: Lucas GIRARDOT Date: Wed, 22 Jun 2022 13:56:31 +0200 Subject: [PATCH] Fix joinRel and wherehasIn when key is not primary key --- changelog.md | 5 +++++ src/Eloquent/JoinRelBuilder.php | 8 ++++---- src/Eloquent/Mixins/WhereHasInMixin.php | 20 ++++++++++---------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/changelog.md b/changelog.md index 129fdcb..7e5aa07 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,11 @@ Changelog ========= +3.1.1 (2022-06-22) +------------------ + +- Fix joinRel and wherehasIn when key is not primary key + 3.1.0 (2022-02-11) ------------------ diff --git a/src/Eloquent/JoinRelBuilder.php b/src/Eloquent/JoinRelBuilder.php index 1a2f3e8..9073772 100644 --- a/src/Eloquent/JoinRelBuilder.php +++ b/src/Eloquent/JoinRelBuilder.php @@ -73,7 +73,7 @@ public function apply(Builder $query, $relationName, $alias = null, $callback = $this->models[$alias] = $relation->getRelated(); $table = $relation->getRelated()->getTable().' as '.$alias; - + $relation->getRelated()->setTable($alias); $relation->getParent()->setTable($parentAlias); @@ -85,7 +85,7 @@ public function apply(Builder $query, $relationName, $alias = null, $callback = } /** - * Add condition to join clause using Eloquent relationship. + * Add condition to join clause using Eloquent relationship. * * Supports: HasOne, HasMany, MorphOne, MorphMany, BelongsTo * @@ -98,11 +98,11 @@ public function apply(Builder $query, $relationName, $alias = null, $callback = protected function addCondition(JoinClause $join, Relation $relation, $callback, $withTrashed) { if ($relation instanceof HasOneOrMany) { - $relationKey1 = $relation->getParent()->getQualifiedKeyName(); + $relationKey1 = $relation->getParent()->getTable().'.'.$relation->getLocalKeyName(); $relationKey2 = $relation->getRelated()->getTable().'.'.$relation->getForeignKeyName(); } elseif ($relation instanceof BelongsTo) { - $relationKey1 = $relation->getRelated()->getQualifiedKeyName(); + $relationKey1 = $relation->getRelated()->getTable().'.'.$relation->getOwnerKeyName(); $relationKey2 = $relation->getParent()->getTable().'.'.$relation->getForeignKeyName(); } else { diff --git a/src/Eloquent/Mixins/WhereHasInMixin.php b/src/Eloquent/Mixins/WhereHasInMixin.php index f6511e2..3aaed80 100644 --- a/src/Eloquent/Mixins/WhereHasInMixin.php +++ b/src/Eloquent/Mixins/WhereHasInMixin.php @@ -27,33 +27,33 @@ public function whereHasIn() $relation = Relation::noConstraints(function () use ($relationName) { return $this->model->{$relationName}(); }); - + $relationSubQuery = $relation->getQuery(); - + if ($callback !== null) { $callback($relationSubQuery); } - + if ($relation instanceof HasOneOrMany) { - $relationKey1 = $relation->getParent()->getQualifiedKeyName(); + $relationKey1 = $relation->getParent()->getTable().'.'.$relation->getLocalKeyName(); $relationKey2 = $relation->getRelated()->getTable().'.'.$relation->getForeignKeyName(); - + } elseif ($relation instanceof BelongsTo) { - $relationKey1 = $relation->getRelated()->getQualifiedKeyName(); + $relationKey1 = $relation->getRelated()->getTable().'.'.$relation->getOwnerKeyName(); $relationKey2 = $relation->getParent()->getTable().'.'.$relation->getForeignKeyName(); - + } elseif ($relation instanceof BelongsToMany) { $relationKey1 = $relation->getQualifiedParentKeyName(); $relationKey2 = $relation->getQualifiedForeignPivotKeyName(); - + } elseif ($relation instanceof HasManyThrough) { $relationKey1 = $relation->getQualifiedLocalKeyName(); $relationKey2 = $relation->getQualifiedFirstKeyName(); - + } else { throw new WhereHasInException('Relation '.get_class($relation).' not supported.'); } - + return $this->whereIn( $relationKey1, $relationSubQuery->select($relationKey2),