From 02745d0bc046bb75ab0036cced15f0227821ed22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A1i=20Thi=C3=AAn=20V=C5=A9?= Date: Tue, 21 Jan 2025 11:08:58 +0700 Subject: [PATCH 1/3] Wrap key name before casting to prevent incorrect query generation --- src/Database/Relations/Concerns/AttachOneOrMany.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Database/Relations/Concerns/AttachOneOrMany.php b/src/Database/Relations/Concerns/AttachOneOrMany.php index 758465d92..b44241990 100644 --- a/src/Database/Relations/Concerns/AttachOneOrMany.php +++ b/src/Database/Relations/Concerns/AttachOneOrMany.php @@ -72,9 +72,10 @@ public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $query = $this->getRelationExistenceQueryForSelfJoin($query, $parentQuery, $columns); } else { - $key = DbDongle::cast($this->getQualifiedParentKeyName(), 'TEXT'); + $grammar = $this->query->getGrammar(); + $key = DbDongle::cast($grammar->wrap($this->getQualifiedParentKeyName()), 'TEXT'); - $query = $query->select($columns)->whereColumn($this->getExistenceCompareKey(), '=', $key); + $query = $query->select($columns)->whereRaw($grammar->wrap($this->getExistenceCompareKey()) . '=' . $key); } $query = $query->where($this->morphType, $this->morphClass); @@ -98,9 +99,10 @@ public function getRelationExistenceQueryForSelfRelation(Builder $query, Builder $query->getModel()->setTable($hash); - $key = DbDongle::cast($this->getQualifiedParentKeyName(), 'TEXT'); + $grammar = $query->getGrammar(); + $key = DbDongle::cast($grammar->wrap($this->getQualifiedParentKeyName()), 'TEXT'); - return $query->whereColumn($hash.'.'.$this->getForeignKeyName(), '=', $key); + return $query->whereRaw($grammar->wrap($hash.'.'.$this->getForeignKeyName()) . '=' . $key); } /** From 469e01c0dc38934410dd7d3ea3448d881e9241ae Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Wed, 26 Feb 2025 16:21:10 -0600 Subject: [PATCH 2/3] Code style tweaks --- .../Relations/Concerns/AttachOneOrMany.php | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/Database/Relations/Concerns/AttachOneOrMany.php b/src/Database/Relations/Concerns/AttachOneOrMany.php index b44241990..aa9eda49a 100644 --- a/src/Database/Relations/Concerns/AttachOneOrMany.php +++ b/src/Database/Relations/Concerns/AttachOneOrMany.php @@ -70,17 +70,17 @@ public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, { if ($parentQuery->getQuery()->from == $query->getQuery()->from) { $query = $this->getRelationExistenceQueryForSelfJoin($query, $parentQuery, $columns); - } - else { + } else { $grammar = $this->query->getGrammar(); - $key = DbDongle::cast($grammar->wrap($this->getQualifiedParentKeyName()), 'TEXT'); - - $query = $query->select($columns)->whereRaw($grammar->wrap($this->getExistenceCompareKey()) . '=' . $key); + $query->select($columns)->whereRaw(sprintf( + '%s = %s', + $grammar->wrap($this->getExistenceCompareKey()), + DbDongle::cast($grammar->wrap($this->getQualifiedParentKeyName()), 'TEXT') + )); } - $query = $query->where($this->morphType, $this->morphClass); - - return $query->where('field', $this->fieldName); + return $query->where($this->morphType, $this->morphClass) + ->where('field', $this->fieldName); } /** @@ -93,16 +93,19 @@ public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, */ public function getRelationExistenceQueryForSelfRelation(Builder $query, Builder $parentQuery, $columns = ['*']) { + $hash = $this->getRelationCountHash(); + $grammar = $query->getGrammar(); + $query->select($columns)->from( - $query->getModel()->getTable().' as '.$hash = $this->getRelationCountHash() + $query->getModel()->getTable() . ' as ' . $hash ); - $query->getModel()->setTable($hash); - $grammar = $query->getGrammar(); - $key = DbDongle::cast($grammar->wrap($this->getQualifiedParentKeyName()), 'TEXT'); - - return $query->whereRaw($grammar->wrap($hash.'.'.$this->getForeignKeyName()) . '=' . $key); + return $query->whereRaw(sprintf( + '%s = %s', + $grammar->wrap($hash . '.' . $this->getForeignKeyName()), + DbDongle::cast($grammar->wrap($this->getQualifiedParentKeyName()), 'TEXT') + )); } /** From d769e6491a546b13b387a9246661274c64d53c50 Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Wed, 26 Feb 2025 16:22:42 -0600 Subject: [PATCH 3/3] Update src/Database/Relations/Concerns/AttachOneOrMany.php --- src/Database/Relations/Concerns/AttachOneOrMany.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Database/Relations/Concerns/AttachOneOrMany.php b/src/Database/Relations/Concerns/AttachOneOrMany.php index aa9eda49a..ff07ae3be 100644 --- a/src/Database/Relations/Concerns/AttachOneOrMany.php +++ b/src/Database/Relations/Concerns/AttachOneOrMany.php @@ -71,7 +71,7 @@ public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, if ($parentQuery->getQuery()->from == $query->getQuery()->from) { $query = $this->getRelationExistenceQueryForSelfJoin($query, $parentQuery, $columns); } else { - $grammar = $this->query->getGrammar(); + $grammar = $query->getGrammar(); $query->select($columns)->whereRaw(sprintf( '%s = %s', $grammar->wrap($this->getExistenceCompareKey()),