Skip to content

Commit 619dd11

Browse files
erikaraujobrendt
andauthored
feat(database): add HasConditions to query builders (#1154)
Co-authored-by: Brent Roose <[email protected]>
1 parent 4baead1 commit 619dd11

File tree

6 files changed

+109
-0
lines changed

6 files changed

+109
-0
lines changed

src/Tempest/Database/src/Builder/QueryBuilders/DeleteQueryBuilder.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Tempest\Database\Query;
88
use Tempest\Database\QueryStatements\DeleteStatement;
99
use Tempest\Database\QueryStatements\WhereStatement;
10+
use Tempest\Support\Conditions\HasConditions;
1011

1112
use function Tempest\Database\model;
1213

@@ -15,6 +16,8 @@
1516
*/
1617
final class DeleteQueryBuilder
1718
{
19+
use HasConditions;
20+
1821
private DeleteStatement $delete;
1922

2023
private array $bindings = [];

src/Tempest/Database/src/Builder/QueryBuilders/SelectQueryBuilder.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Tempest\Database\QueryStatements\WhereStatement;
1818
use Tempest\Database\Virtual;
1919
use Tempest\Support\Arr\ImmutableArray;
20+
use Tempest\Support\Conditions\HasConditions;
2021

2122
use function Tempest\map;
2223
use function Tempest\reflect;
@@ -27,6 +28,8 @@
2728
*/
2829
final class SelectQueryBuilder
2930
{
31+
use HasConditions;
32+
3033
/** @var class-string<TModelClass> $modelClass */
3134
private readonly string $modelClass;
3235

src/Tempest/Database/src/Builder/QueryBuilders/UpdateQueryBuilder.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@
1010
use Tempest\Mapper\SerializerFactory;
1111
use Tempest\Reflection\ClassReflector;
1212
use Tempest\Support\Arr\ImmutableArray;
13+
use Tempest\Support\Conditions\HasConditions;
1314

1415
use function Tempest\Database\model;
1516
use function Tempest\Support\arr;
1617

1718
final class UpdateQueryBuilder
1819
{
20+
use HasConditions;
21+
1922
private UpdateStatement $update;
2023

2124
private array $bindings = [];

tests/Integration/Database/Builder/DeleteQueryBuilderTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Tests\Tempest\Integration\Database\Builder;
44

5+
use Tempest\Database\Builder\QueryBuilders\DeleteQueryBuilder;
56
use Tempest\Database\Id;
67
use Tests\Tempest\Fixtures\Modules\Books\Models\Author;
78
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
@@ -68,4 +69,32 @@ public function test_delete_on_model_object(): void
6869
$query->bindings['id']->id,
6970
);
7071
}
72+
73+
public function test_delete_on_plain_table_with_conditions(): void
74+
{
75+
$query = query('foo')
76+
->delete()
77+
->when(
78+
true,
79+
fn (DeleteQueryBuilder $query) => $query->where('`bar` = ?', 'boo'),
80+
)
81+
->when(
82+
false,
83+
fn (DeleteQueryBuilder $query) => $query->where('`bar` = ?', 'foo'),
84+
)
85+
->build();
86+
87+
$this->assertSame(
88+
<<<SQL
89+
DELETE FROM `foo`
90+
WHERE `bar` = ?
91+
SQL,
92+
$query->getSql(),
93+
);
94+
95+
$this->assertSame(
96+
'boo',
97+
$query->bindings[0],
98+
);
99+
}
71100
}

tests/Integration/Database/Builder/SelectQueryBuilderTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Tests\Tempest\Integration\Database\Builder;
66

7+
use Tempest\Database\Builder\QueryBuilders\SelectQueryBuilder;
78
use Tempest\Database\Migrations\CreateMigrationsTable;
89
use Tests\Tempest\Fixtures\Migrations\CreateAuthorTable;
910
use Tests\Tempest\Fixtures\Migrations\CreateBookTable;
@@ -192,4 +193,41 @@ public function test_raw(): void
192193
$this->assertCount(1, $books);
193194
$this->assertSame('A', $books[0]->title);
194195
}
196+
197+
public function test_select_query_with_conditions(): void
198+
{
199+
$query = query('chapters')
200+
->select('title', 'index')
201+
->when(
202+
true,
203+
fn (SelectQueryBuilder $query) => $query
204+
->where('`title` = ?', 'Timeline Taxi')
205+
->andWhere('`index` <> ?', '1')
206+
->orWhere('`createdAt` > ?', '2025-01-01'),
207+
)
208+
->when(
209+
false,
210+
fn (SelectQueryBuilder $query) => $query
211+
->where('`title` = ?', 'Timeline Uber')
212+
->andWhere('`index` <> ?', '2')
213+
->orWhere('`createdAt` > ?', '2025-01-02'),
214+
)
215+
->orderBy('`index` ASC')
216+
->build();
217+
218+
$expected = <<<SQL
219+
SELECT `title`, `index`
220+
FROM `chapters`
221+
WHERE `title` = ?
222+
AND `index` <> ?
223+
OR `createdAt` > ?
224+
ORDER BY `index` ASC
225+
SQL;
226+
227+
$sql = $query->getSql();
228+
$bindings = $query->bindings;
229+
230+
$this->assertSame($expected, $sql);
231+
$this->assertSame(['Timeline Taxi', '1', '2025-01-01'], $bindings);
232+
}
195233
}

tests/Integration/Database/Builder/UpdateQueryBuilderTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Tests\Tempest\Integration\Database\Builder;
44

5+
use Tempest\Database\Builder\QueryBuilders\UpdateQueryBuilder;
56
use Tempest\Database\Exceptions\CannotUpdateHasManyRelation;
67
use Tempest\Database\Exceptions\InvalidUpdateStatement;
78
use Tempest\Database\Id;
@@ -213,4 +214,36 @@ public function test_attach_new_has_many_relation_on_update(): void
213214
// )
214215
// ->build();
215216
}
217+
218+
public function test_update_on_plain_table_with_conditions(): void
219+
{
220+
$query = query('chapters')
221+
->update(
222+
title: 'Chapter 01',
223+
index: 1,
224+
)
225+
->when(
226+
true,
227+
fn (UpdateQueryBuilder $query) => $query->where('`id` = ?', 10),
228+
)
229+
->when(
230+
false,
231+
fn (UpdateQueryBuilder $query) => $query->where('`id` = ?', 20),
232+
)
233+
->build();
234+
235+
$this->assertSame(
236+
<<<SQL
237+
UPDATE `chapters`
238+
SET `title` = ?, `index` = ?
239+
WHERE `id` = ?
240+
SQL,
241+
$query->getSql(),
242+
);
243+
244+
$this->assertSame(
245+
['Chapter 01', 1, 10],
246+
$query->bindings,
247+
);
248+
}
216249
}

0 commit comments

Comments
 (0)