diff --git a/src/QueryDataTable.php b/src/QueryDataTable.php index 279db784..3e384962 100644 --- a/src/QueryDataTable.php +++ b/src/QueryDataTable.php @@ -358,6 +358,11 @@ public function columnControlSearch(): void continue; } + // Only resolve relation after checking for a custom filter. + // Because the custom filter for a column might not be found, e.g., $this->hasFilterColumn($columnName) + // and applyFilterColumn() already resolves relations + $columnName = $this->resolveRelationColumn($columnName); + if ($list) { if (str_contains($logic, 'not')) { $this->query->whereNotIn($columnName, $list); diff --git a/tests/Unit/QueryDataTableTest.php b/tests/Unit/QueryDataTableTest.php index 4e7ee785..20864a72 100644 --- a/tests/Unit/QueryDataTableTest.php +++ b/tests/Unit/QueryDataTableTest.php @@ -4,6 +4,7 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; +use PHPUnit\Framework\Attributes\Test; use Yajra\DataTables\Tests\Models\User; use Yajra\DataTables\Tests\TestCase; @@ -171,4 +172,42 @@ public function assertQueryHasNoSelect($expected, $query): void $this->assertSame($expected, Str::startsWith($sql, 'select count(*) from (select 1 as dt_row_count from'), "'{$sql}' has select"); } + + #[Test] + public function test_column_name_is_resolved_in_column_control(): void + { + app('datatables.request')->merge([ + 'columns' => [ + [ + 'name' => 'id', + 'data' => 'id', + 'searchable' => 'true', + 'orderable' => 'true', + 'search' => ['value' => null, 'regex' => 'false'], + 'columnControl' => [ + 'search' => [ + 'value' => '123', + 'logic' => 'equal', + 'type' => 'num', + ], + ], + ], + ], + ]); + + /** @var \Yajra\DataTables\QueryDataTable $dataTable */ + $dataTable = app('datatables')->of( + User::query() + ->select('users.*') + ->join('role_user', 'users.id', '=', 'role_user.user_id') + ->join('roles', 'role_user.role_id', '=', 'roles.id') + ); + + $dataTable->columnControlSearch(); + + $this->assertStringContainsString( + '"users"."id" = \'123\'', + $dataTable->getQuery()->toRawSql() + ); + } }