From e4863fd53053a7cb3ddac8b16a603da5f2976379 Mon Sep 17 00:00:00 2001 From: DevHero Date: Wed, 8 Apr 2026 02:05:56 +0700 Subject: [PATCH 1/6] Fix alias assignment to preserve case sensitivity The table alias is currently forced to lowercase, which limits flexibility. --- src/Pecee/Pixie/QueryBuilder/QueryBuilderHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pecee/Pixie/QueryBuilder/QueryBuilderHandler.php b/src/Pecee/Pixie/QueryBuilder/QueryBuilderHandler.php index 22be66a..b861ea8 100644 --- a/src/Pecee/Pixie/QueryBuilder/QueryBuilderHandler.php +++ b/src/Pecee/Pixie/QueryBuilder/QueryBuilderHandler.php @@ -698,7 +698,7 @@ public function alias(string $alias, ?string $table = null): self $table = $this->tablePrefix . $table; } - $this->statements['aliases'][$table] = \strtolower($alias); + $this->statements['aliases'][$table] = $alias; return $this; } @@ -1883,4 +1883,4 @@ public function close(): void $this->connection = null; } -} \ No newline at end of file +} From 0d0df27cad726dd0824278d488ee92249d3ebbea Mon Sep 17 00:00:00 2001 From: DevHero Date: Wed, 8 Apr 2026 02:39:18 +0700 Subject: [PATCH 2/6] Fix alias case sensitivity in SQL Server adapter --- src/Pecee/Pixie/QueryBuilder/Adapters/Sqlserver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pecee/Pixie/QueryBuilder/Adapters/Sqlserver.php b/src/Pecee/Pixie/QueryBuilder/Adapters/Sqlserver.php index 2d35e5e..972fbac 100644 --- a/src/Pecee/Pixie/QueryBuilder/Adapters/Sqlserver.php +++ b/src/Pecee/Pixie/QueryBuilder/Adapters/Sqlserver.php @@ -75,7 +75,7 @@ public function select(array $statements): array $prefix = $statements['aliases'][$table] ?? null; if ($prefix !== null) { - $t = sprintf('%s AS %s', $table, strtolower($prefix)); + $t = sprintf('%s AS %s', $table, $prefix); } else { $t = sprintf('%s', $table); } @@ -179,4 +179,4 @@ public function wrapSanitizer($value) // Join these back with "." and return return implode('.', $valueArr); } -} \ No newline at end of file +} From 3a98191d1e2e6e7860d308222cc0b2cbcbc2f737 Mon Sep 17 00:00:00 2001 From: DevHero Date: Wed, 8 Apr 2026 02:42:15 +0700 Subject: [PATCH 3/6] Fix aliasPrefix handling in buildAliasedTableName --- src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php index 05d32bc..b211b3c 100644 --- a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php +++ b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php @@ -358,7 +358,7 @@ protected function buildAliasedTableName(string $table, array $statements): stri { $this->aliasPrefix = $statements['aliases'][$table] ?? null; if ($this->aliasPrefix !== null) { - return sprintf('%s AS %s', $this->wrapSanitizer($table), $this->wrapSanitizer(strtolower($this->aliasPrefix))); + return sprintf('%s AS %s', $this->wrapSanitizer($table), $this->wrapSanitizer($this->aliasPrefix)); } return sprintf('%s', $this->wrapSanitizer($table)); @@ -807,4 +807,4 @@ public function wrapSanitizer($value) // Join these back with "." and return return implode('.', $valueArr); } -} \ No newline at end of file +} From 852d33eadfc49c9bd9ed86ac175e27a7081983f6 Mon Sep 17 00:00:00 2001 From: DevHero Date: Thu, 16 Apr 2026 01:26:05 +0700 Subject: [PATCH 4/6] Fix binding merge for Raw values in BaseAdapter Fixed the way bindings are merged for Raw values. --- src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php index b211b3c..4b19ada 100644 --- a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php +++ b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php @@ -443,7 +443,7 @@ private function doInsert(array $statements, array $data, $type): array $keys[] = $key; if ($value instanceof Raw) { $values[] = (string)$value; - $bindings[] = $value->getBindings(); + $bindings = array_merge($bindings, (array)$value->getBindings()); // ✅ FIXED } else { $values[] = '?'; $bindings[] = $value; From b125871031fe16b674444b389843860f96e59aa7 Mon Sep 17 00:00:00 2001 From: DevHero Date: Thu, 16 Apr 2026 01:33:08 +0700 Subject: [PATCH 5/6] Update BaseAdapter.php --- src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php index 4b19ada..2a59ff5 100644 --- a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php +++ b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php @@ -493,7 +493,7 @@ private function getUpdateStatement(array $data): array if ($value instanceof Raw) { $statements[] = $statement . $value; - $bindings += $value->getBindings(); + $bindings = array_merge($bindings, (array)$value->getBindings()); // fixed } else { $statements[] = $statement . '?'; $bindings[] = $value; From 0e90fb7c54bf1a5749a44c62364510a0a24792b4 Mon Sep 17 00:00:00 2001 From: DevHero Date: Mon, 4 May 2026 11:45:27 +0700 Subject: [PATCH 6/6] Support where() closure didn't add any criteria (empty closure) ->where(function ($q) { // can empty }) --- .../Pixie/QueryBuilder/Adapters/BaseAdapter.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php index 2a59ff5..32c19d1 100644 --- a/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php +++ b/src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php @@ -186,11 +186,23 @@ protected function buildCriteria(array $statements, bool $bindValues = true): ar // Get the criteria only query from the nestedCriteria object $queryObject = $nestedCriteria->getQuery('criteriaOnly', true); + // Skip if the closure didn't add any criteria (empty closure) + $sql = $queryObject->getSql(); + if (trim($sql) === '') + { + // Remove the joiner (AND/OR) that was already pushed before the closure check + if ($joiner !== '') + { + array_pop($criteria); + } + continue; + } + // Merge the bindings we get from nestedCriteria object $bindings[] = $queryObject->getBindings(); // Append the sql we get from the nestedCriteria object - $criteria[] = "({$queryObject->getSql()})"; + $criteria[] = "({$sql})"; continue; } @@ -375,7 +387,8 @@ protected function buildAliasedTableName(string $table, array $statements): stri */ public function criteriaOnly(array $statements, $bindValues = true): array { - $sql = $bindings = []; + $sql = ''; + $bindings = []; if (isset($statements['criteria']) === false) { return compact('sql', 'bindings'); }