Skip to content

Commit 33e9125

Browse files
committed
feat(database): add tap to query builders
1 parent c6f62f4 commit 33e9125

File tree

11 files changed

+137
-12
lines changed

11 files changed

+137
-12
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*/
2222
final class CountQueryBuilder implements BuildsQuery
2323
{
24-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
24+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TapsQueryBuilder;
2525

2626
private CountStatement $count;
2727

@@ -86,4 +86,9 @@ private function getModel(): ModelInspector
8686
{
8787
return $this->model;
8888
}
89+
90+
private function clone(): self
91+
{
92+
return clone $this;
93+
}
8994
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
final class DeleteQueryBuilder implements BuildsQuery
2020
{
21-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
21+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TapsQueryBuilder;
2222

2323
private DeleteStatement $delete;
2424

@@ -81,4 +81,9 @@ private function getModel(): ModelInspector
8181
{
8282
return $this->model;
8383
}
84+
85+
private function clone(): self
86+
{
87+
return clone $this;
88+
}
8489
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
final class InsertQueryBuilder implements BuildsQuery
2121
{
22-
use HasConditions, OnDatabase;
22+
use HasConditions, OnDatabase, TapsQueryBuilder;
2323

2424
private InsertStatement $insert;
2525

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
*/
3434
final class SelectQueryBuilder implements BuildsQuery
3535
{
36-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
36+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TapsQueryBuilder;
3737

3838
private ModelInspector $model;
3939

@@ -232,11 +232,6 @@ public function build(mixed ...$bindings): Query
232232
return new Query($this->select, [...$this->bindings, ...$bindings])->onDatabase($this->onDatabase);
233233
}
234234

235-
private function clone(): self
236-
{
237-
return clone $this;
238-
}
239-
240235
/** @return \Tempest\Database\Relation[] */
241236
private function getIncludedRelations(): array
242237
{
@@ -270,4 +265,9 @@ private function getModel(): ModelInspector
270265
{
271266
return $this->model;
272267
}
268+
269+
private function clone(): self
270+
{
271+
return clone $this;
272+
}
273273
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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 TapsQueryBuilder
11+
{
12+
/**
13+
* Returns a new instance of the query builder with the given callback applied.
14+
*
15+
* @param callable($this) $callback
16+
*/
17+
public function tap(callable $callback): static
18+
{
19+
return tap($this->clone(), $callback);
20+
}
21+
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
*/
2525
final class UpdateQueryBuilder implements BuildsQuery
2626
{
27-
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods;
27+
use HasConditions, OnDatabase, HasWhereQueryBuilderMethods, TapsQueryBuilder;
2828

2929
private UpdateStatement $update;
3030

@@ -153,4 +153,9 @@ private function getModel(): ModelInspector
153153
{
154154
return $this->model;
155155
}
156+
157+
private function clone(): self
158+
{
159+
return clone $this;
160+
}
156161
}

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

tests/Integration/Database/Builder/CountQueryBuilderTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,21 @@ public function test_multiple_where_field(): void
212212

213213
$this->assertSameWithoutBackticks($expected, $sql);
214214
}
215+
216+
public function test_tap(): void
217+
{
218+
$this->migrate(CreateMigrationsTable::class, CreatePublishersTable::class, CreateAuthorTable::class);
219+
220+
query('authors')->insert(
221+
['id' => 1, 'name' => 'Brent'],
222+
['id' => 2, 'name' => 'Other'],
223+
)->execute();
224+
225+
$count = query('authors')
226+
->count()
227+
->tap(fn (CountQueryBuilder $query) => $query->where('id = ?', 1))
228+
->execute();
229+
230+
$this->assertSame(1, $count);
231+
}
215232
}

tests/Integration/Database/Builder/DeleteQueryBuilderTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,19 @@ public function test_multiple_where_field(): void
154154

155155
$this->assertSameWithoutBackticks($expected, $sql);
156156
}
157+
158+
public function test_tap(): void
159+
{
160+
$query = query('foo')
161+
->delete()
162+
->tap(fn (DeleteQueryBuilder $query) => $query->where('bar = ?', 'boo'))
163+
->build();
164+
165+
$this->assertSameWithoutBackticks(<<<SQL
166+
DELETE FROM `foo`
167+
WHERE bar = ?
168+
SQL, $query->toSql());
169+
170+
$this->assertSameWithoutBackticks('boo', $query->bindings[0]);
171+
}
157172
}

tests/Integration/Database/Builder/SelectQueryBuilderTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,47 @@ public function test_group_by(): void
424424
$this->assertSameWithoutBackticks($expected, $sql);
425425
}
426426

427+
public function test_tap(): void
428+
{
429+
$sql = query('authors')
430+
->select()
431+
->tap(fn (SelectQueryBuilder $query) => $query->where('name = ?', 'Brent'))
432+
->toSql();
433+
434+
$expected = <<<SQL
435+
SELECT *
436+
FROM authors
437+
WHERE name = ?
438+
SQL;
439+
440+
$this->assertSameWithoutBackticks($expected, $sql);
441+
}
442+
443+
public function test_tap_invokable(): void
444+
{
445+
$sql = query('authors')
446+
->select()
447+
->tap(new readonly class('Brent') {
448+
public function __construct(
449+
private string $author,
450+
) {}
451+
452+
public function __invoke(SelectQueryBuilder $query): void
453+
{
454+
$query->where('name = ?', $this->author);
455+
}
456+
})
457+
->toSql();
458+
459+
$expected = <<<SQL
460+
SELECT *
461+
FROM authors
462+
WHERE name = ?
463+
SQL;
464+
465+
$this->assertSameWithoutBackticks($expected, $sql);
466+
}
467+
427468
public function test_having(): void
428469
{
429470
$sql = query('authors')

0 commit comments

Comments
 (0)