From 75052290f145c4cfd56e8438142a731fcd203b18 Mon Sep 17 00:00:00 2001 From: Glenn Jacobs Date: Tue, 8 Jul 2025 11:24:51 +0100 Subject: [PATCH] Fix pgsql json search --- packages/support/src/helpers.php | 14 +++++++++++ tests/src/Support/helpersTest.php | 39 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/packages/support/src/helpers.php b/packages/support/src/helpers.php index 0c9761a80d..bae9ee60b7 100644 --- a/packages/support/src/helpers.php +++ b/packages/support/src/helpers.php @@ -170,6 +170,20 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { }; } + $column = match ($driverName) { + 'pgsql' => str($column)->contains('->') + ? str($column) + ->beforeLast('->') + ->append('->>') + ->append("'") + ->append(str($column)->afterLast('->')) + ->append("'") + : $column, + default => $column, + }; + + echo $column; + $column = match ($driverName) { 'pgsql' => "{$column}::text", default => $column, diff --git a/tests/src/Support/helpersTest.php b/tests/src/Support/helpersTest.php index 1eec5125fc..a8708633af 100644 --- a/tests/src/Support/helpersTest.php +++ b/tests/src/Support/helpersTest.php @@ -1,7 +1,12 @@ 'bar', ]); }); + +it('will generate json search column expression for mysql', function () { + $column = 'data->name'; + $isSearchForcedCaseInsensitive = true; + + $databaseConnection = Mockery::mock(Connection::class); + $databaseConnection->shouldReceive('getDriverName')->andReturn('mysql'); + $databaseConnection->shouldReceive('getConfig')->with('search_collation')->andReturn(null); + + $grammar = new MySqlGrammar($databaseConnection); + + $databaseConnection->shouldReceive('getQueryGrammar')->andReturn($grammar); + + $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); + + expect($expression->getValue($grammar)) + ->toBe("lower(json_extract(`data`, '$.\"name\"'))"); +}); + +it('will generate json search column expression for pgsql', function () { + $column = 'data->name'; + $isSearchForcedCaseInsensitive = true; + + $databaseConnection = Mockery::mock(Connection::class); + $databaseConnection->shouldReceive('getDriverName')->andReturn('pgsql'); + $databaseConnection->shouldReceive('getConfig')->with('search_collation')->andReturn(null); + + $grammar = new PostgresGrammar($databaseConnection); + + $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); + + expect($expression->getValue($grammar)) + ->toBe("lower(data->>'name'::text)"); +});