From 08d377f4870b110bd24338146ab380ca0e6526a4 Mon Sep 17 00:00:00 2001 From: Namoshek Date: Tue, 29 Jun 2021 18:30:38 +0200 Subject: [PATCH 1/3] Prevent undefined array key exception Fixes usage of `orderByRaw`: > ErrorException: Undefined array key \"column\" in /var/www/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php:220 --- src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php index ab276c306b44..e5c97c4183d1 100755 --- a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php @@ -217,7 +217,7 @@ protected function queryOrderContainsSubquery($query) } return Arr::first($query->orders, function ($value) { - return $this->isExpression($value['column']); + return $this->isExpression($value['column'] ?? null); }, false) !== false; } From 4356eece60e2a56bc04964c62d20947a964ba9ad Mon Sep 17 00:00:00 2001 From: Marvin Mall Date: Tue, 29 Jun 2021 19:02:34 +0200 Subject: [PATCH 2/3] Add tests for SqlServerGrammar orderBy/orderByRaw The tests are similar to the existing ones used by the generic query builder and grammar. --- tests/Database/DatabaseQueryBuilderTest.php | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index c83d310cc0db..90074b14ce5d 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1190,6 +1190,36 @@ public function testOrderBys() $this->assertEquals([1, 1, 'news', 'opinion'], $builder->getBindings()); } + public function testOrderBysSqlServer() + { + $builder = $this->getSqlServerBuilder(); + $builder->select('*')->from('users')->orderBy('email')->orderBy('age', 'desc'); + $this->assertSame('select * from [users] order by [email] asc, [age] desc', $builder->toSql()); + + $builder->orders = null; + $this->assertSame('select * from [users]', $builder->toSql()); + + $builder->orders = []; + $this->assertSame('select * from [users]', $builder->toSql()); + + $builder = $this->getSqlServerBuilder(); + $builder->select('*')->from('users')->orderBy('email'); + $this->assertSame('select * from [users] order by [email] asc', $builder->toSql()); + + $builder = $this->getSqlServerBuilder(); + $builder->select('*')->from('users')->orderByDesc('name'); + $this->assertSame('select * from [users] order by [name] desc', $builder->toSql()); + + $builder = $this->getSqlServerBuilder(); + $builder->select('*')->from('users')->orderByRaw('[age] asc'); + $this->assertSame('select * from [users] order by [age] asc', $builder->toSql()); + + $builder = $this->getSqlServerBuilder(); + $builder->select('*')->from('users')->orderBy('email')->orderByRaw('[age] ? desc', ['foo']); + $this->assertSame('select * from [users] order by [email] asc, [age] ? desc', $builder->toSql()); + $this->assertEquals(['foo'], $builder->getBindings()); + } + public function testReorder() { $builder = $this->getBuilder(); From ae1c77d62be60a8097e9e4bc17ac636a79370f1e Mon Sep 17 00:00:00 2001 From: Marvin Mall Date: Tue, 29 Jun 2021 19:09:51 +0200 Subject: [PATCH 3/3] Add offset/limit test case with orderByRaw --- tests/Database/DatabaseQueryBuilderTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index 90074b14ce5d..d5013fab3c60 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1218,6 +1218,10 @@ public function testOrderBysSqlServer() $builder->select('*')->from('users')->orderBy('email')->orderByRaw('[age] ? desc', ['foo']); $this->assertSame('select * from [users] order by [email] asc, [age] ? desc', $builder->toSql()); $this->assertEquals(['foo'], $builder->getBindings()); + + $builder = $this->getSqlServerBuilder(); + $builder->select('*')->from('users')->skip(25)->take(10)->orderByRaw('[email] desc'); + $this->assertSame('select * from (select *, row_number() over (order by [email] desc) as row_num from [users]) as temp_table where row_num between 26 and 35 order by row_num', $builder->toSql()); } public function testReorder()