From 06ebcb116627483191a9c335d7c199154e55dd55 Mon Sep 17 00:00:00 2001 From: Markus Hebenstreit Date: Mon, 4 Dec 2023 07:46:40 +0100 Subject: [PATCH 1/3] Added failing tests for computed columns in order by or where constraint --- tests/Integration/BuilderTest.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/Integration/BuilderTest.php b/tests/Integration/BuilderTest.php index 47de73e..f4058fd 100644 --- a/tests/Integration/BuilderTest.php +++ b/tests/Integration/BuilderTest.php @@ -204,6 +204,32 @@ public function selects_are_overwritten() ); } + /** @test */ + public function selects_are_preserved_if_used_in_order_by() + { + $queries = $this->withQueriesLogged(function () use (&$results) { + $results = User::query()->selectRaw('(select 1 as computed_column)')->orderBy('computed_column')->fastPaginate(); + }); + + $this->assertEquals( + 'select `users`.`id`, computed_column from `users` order by `computed_column` asc limit 15 offset 0', + $queries[1]['query'] + ); + } + + /** @test */ + public function selects_are_preserved_if_used_in_where_constraint() + { + $queries = $this->withQueriesLogged(function () use (&$results) { + $results = User::query()->selectRaw('(select 1 as computed_column)')->where('computed_column', 1)->fastPaginate(); + }); + + $this->assertEquals( + 'select `users`.`id`, computed_column from `users` where `computed_column` = 1 asc limit 15 offset 0', + $queries[1]['query'] + ); + } + /** @test */ public function havings_defer() { From 95fefe0cd81e4aa72ac73db019e97276f2b05f24 Mon Sep 17 00:00:00 2001 From: Markus Hebenstreit Date: Tue, 5 Dec 2023 16:32:18 +0100 Subject: [PATCH 2/3] corrected test --- tests/Integration/BuilderTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Integration/BuilderTest.php b/tests/Integration/BuilderTest.php index f4058fd..8ff8aee 100644 --- a/tests/Integration/BuilderTest.php +++ b/tests/Integration/BuilderTest.php @@ -212,7 +212,7 @@ public function selects_are_preserved_if_used_in_order_by() }); $this->assertEquals( - 'select `users`.`id`, computed_column from `users` order by `computed_column` asc limit 15 offset 0', + 'select `users`.`id`, (select 1 as computed_column) from `users` order by `computed_column` asc limit 15 offset 0', $queries[1]['query'] ); } @@ -225,7 +225,7 @@ public function selects_are_preserved_if_used_in_where_constraint() }); $this->assertEquals( - 'select `users`.`id`, computed_column from `users` where `computed_column` = 1 asc limit 15 offset 0', + 'select `users`.`id`, (select 1 as computed_column) from `users` where `computed_column` = 1 asc limit 15 offset 0', $queries[1]['query'] ); } From b4da72b99fdf038b66f85b874dfc29a727932f66 Mon Sep 17 00:00:00 2001 From: Aaron Francis Date: Wed, 15 May 2024 12:13:19 -0500 Subject: [PATCH 3/3] fix unwrapped column aliases --- src/FastPaginate.php | 14 ++++++++++---- tests/Integration/BuilderTest.php | 19 +++---------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/FastPaginate.php b/src/FastPaginate.php index 2c73821..758ae90 100644 --- a/src/FastPaginate.php +++ b/src/FastPaginate.php @@ -117,10 +117,16 @@ public static function getInnerSelectColumns($builder) ->pluck('column') ->filter() ->map(function ($column) use ($base) { - // Use the grammar to wrap them, so that our `str_contains` - // (further down) doesn't return any false positives. - return $base->grammar->wrap($column); - }); + // Not everyone quotes their custom selects, which + // is totally reasonable. We'll look for both + // quoted and unquoted, as a kindness. + // See https://github.com/hammerstonedev/fast-paginate/pull/57 + return [ + $column, + $base->grammar->wrap($column) + ]; + }) + ->flatten(1); return collect($base->columns) ->filter(function ($column) use ($orders, $base) { diff --git a/tests/Integration/BuilderTest.php b/tests/Integration/BuilderTest.php index 8ff8aee..f5e1b7a 100644 --- a/tests/Integration/BuilderTest.php +++ b/tests/Integration/BuilderTest.php @@ -205,27 +205,14 @@ public function selects_are_overwritten() } /** @test */ - public function selects_are_preserved_if_used_in_order_by() + public function unquoted_selects_are_preserved_if_used_in_order_by() { $queries = $this->withQueriesLogged(function () use (&$results) { - $results = User::query()->selectRaw('(select 1 as computed_column)')->orderBy('computed_column')->fastPaginate(); + $results = User::query()->selectRaw('(select 1) as computed_column')->orderBy('computed_column')->fastPaginate(); }); $this->assertEquals( - 'select `users`.`id`, (select 1 as computed_column) from `users` order by `computed_column` asc limit 15 offset 0', - $queries[1]['query'] - ); - } - - /** @test */ - public function selects_are_preserved_if_used_in_where_constraint() - { - $queries = $this->withQueriesLogged(function () use (&$results) { - $results = User::query()->selectRaw('(select 1 as computed_column)')->where('computed_column', 1)->fastPaginate(); - }); - - $this->assertEquals( - 'select `users`.`id`, (select 1 as computed_column) from `users` where `computed_column` = 1 asc limit 15 offset 0', + 'select `users`.`id`, (select 1) as computed_column from `users` order by `computed_column` asc limit 15 offset 0', $queries[1]['query'] ); }