diff --git a/packages/database/src/Builder/QueryBuilders/SelectQueryBuilder.php b/packages/database/src/Builder/QueryBuilders/SelectQueryBuilder.php index f0d36d08a..3b84ba0a7 100644 --- a/packages/database/src/Builder/QueryBuilders/SelectQueryBuilder.php +++ b/packages/database/src/Builder/QueryBuilders/SelectQueryBuilder.php @@ -168,6 +168,10 @@ public function chunk(Closure $closure, int $amountPerChunk = 200): void */ public function orderBy(string $field, Direction $direction = Direction::ASC): self { + if (str_contains($field, ' ')) { + return $this->orderByRaw($field); + } + $this->select->orderBy[] = new OrderByStatement("`{$field}` {$direction->value}"); return $this; diff --git a/tests/Integration/Database/Builder/SelectQueryBuilderTest.php b/tests/Integration/Database/Builder/SelectQueryBuilderTest.php index 5715193f5..611860797 100644 --- a/tests/Integration/Database/Builder/SelectQueryBuilderTest.php +++ b/tests/Integration/Database/Builder/SelectQueryBuilderTest.php @@ -195,6 +195,24 @@ public function test_order_by_with_field_defaults_to_asc(): void $this->assertSame('A', $book->title); } + public function test_order_by_raw_shorthand(): void + { + $this->migrate( + CreateMigrationsTable::class, + CreatePublishersTable::class, + CreateAuthorTable::class, + CreateBookTable::class, + ); + + Book::new(title: 'A')->save(); + Book::new(title: 'B')->save(); + Book::new(title: 'C')->save(); + Book::new(title: 'D')->save(); + + $book = Book::select()->orderBy('title DESC')->first(); + $this->assertSame('D', $book->title); + } + public function test_order_by_sql_generation(): void { $this->assertSameWithoutBackticks(