Skip to content

Commit 99d5cac

Browse files
committed
feat(database): add transform to query builders
1 parent b912142 commit 99d5cac

File tree

8 files changed

+107
-7
lines changed

8 files changed

+107
-7
lines changed

packages/database/src/Builder/QueryBuilders/CountQueryBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*/
2323
final class CountQueryBuilder implements BuildsQuery
2424
{
25-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
25+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TransformsQueryBuilder;
2626

2727
private CountStatement $count;
2828

packages/database/src/Builder/QueryBuilders/DeleteQueryBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*/
2020
final class DeleteQueryBuilder implements BuildsQuery
2121
{
22-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
22+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TransformsQueryBuilder;
2323

2424
private DeleteStatement $delete;
2525

packages/database/src/Builder/QueryBuilders/InsertQueryBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
*/
3030
final class InsertQueryBuilder implements BuildsQuery
3131
{
32-
use HasConditions, OnDatabase;
32+
use HasConditions, OnDatabase, TransformsQueryBuilder;
3333

3434
private InsertStatement $insert;
3535

packages/database/src/Builder/QueryBuilders/SelectQueryBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
*/
3737
final class SelectQueryBuilder implements BuildsQuery
3838
{
39-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
39+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TransformsQueryBuilder;
4040

4141
private ModelInspector $model;
4242

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Tempest\Database\Builder\QueryBuilders;
4+
5+
use function Tempest\Support\tap;
6+
7+
/**
8+
* @phpstan-require-implements BuildsQuery
9+
*/
10+
trait TransformsQueryBuilder
11+
{
12+
/**
13+
* Returns a new instance of the query builder with the given callback applied.
14+
* @param callable(static) $callback
15+
*/
16+
public function transform(callable $callback): static
17+
{
18+
return tap(clone $this, $callback);
19+
}
20+
}

packages/database/src/Builder/QueryBuilders/UpdateQueryBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
*/
3232
final class UpdateQueryBuilder implements BuildsQuery
3333
{
34-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
34+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TransformsQueryBuilder;
3535

3636
private UpdateStatement $update;
3737

packages/support/src/functions.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ function path(Stringable|string ...$parts): Path
3939
* @template T
4040
*
4141
* @param T $value
42-
* @param (Closure(T): void) $callback
42+
* @param (callable(T): void) $callback
4343
*
4444
* @return T
4545
*/
46-
function tap(mixed $value, Closure $callback): mixed
46+
function tap(mixed $value, callable $callback): mixed
4747
{
4848
$callback($value);
4949

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Tempest\Integration\Database\Builder;
6+
7+
use Tests\Tempest\Fixtures\Modules\Books\Models\Author;
8+
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
9+
10+
use function Tempest\Database\query;
11+
12+
/**
13+
* @internal
14+
*/
15+
final class TransformsQueryBuilderTest extends FrameworkIntegrationTestCase
16+
{
17+
public function test_select_query_builder_transform(): void
18+
{
19+
$query = query(Author::class)
20+
->select()
21+
->transform(fn ($builder) => $builder->where('name', 'Frieren'));
22+
23+
$bindings = $query->build()->bindings;
24+
25+
$this->assertSame(['Frieren'], $bindings);
26+
}
27+
28+
public function test_count_query_builder_transform(): void
29+
{
30+
$query = query(Author::class)
31+
->count()
32+
->transform(fn ($builder) => $builder->where('name', 'Himmel'));
33+
34+
$bindings = $query->build()->bindings;
35+
36+
$this->assertSame(['Himmel'], $bindings);
37+
}
38+
39+
public function test_update_query_builder_transform(): void
40+
{
41+
$query = query(Author::class)
42+
->update(name: 'Heiter')
43+
->transform(fn ($builder) => $builder->where('id', 1));
44+
45+
$bindings = $query->build()->bindings;
46+
47+
$this->assertSame(['Heiter', 1], $bindings);
48+
}
49+
50+
public function test_delete_query_builder_transform(): void
51+
{
52+
$query = query(Author::class)
53+
->delete()
54+
->transform(fn ($builder) => $builder->where('name', 'Eisen'));
55+
56+
$bindings = $query->build()->bindings;
57+
58+
$this->assertSame(['Eisen'], $bindings);
59+
}
60+
61+
public function test_insert_query_builder_transform(): void
62+
{
63+
$query = query(Author::class)
64+
->insert(['name' => 'Stark'])
65+
->transform(fn ($builder) => $builder->then(fn () => null));
66+
67+
$bindings = $query->build()->bindings;
68+
69+
$this->assertSame(['Stark'], $bindings);
70+
}
71+
72+
public function test_transform_returns_new_instance(): void
73+
{
74+
$original = query(Author::class)->select();
75+
76+
$transformed = $original->transform(fn ($builder) => $builder);
77+
78+
$this->assertNotSame($original, $transformed);
79+
}
80+
}

0 commit comments

Comments
 (0)