Skip to content

Commit ad692b8

Browse files
authored
Merge branch 'tempestphp:main' into fix/skip-redis-connection-failed-tests
2 parents 25fbee1 + 900898a commit ad692b8

26 files changed

+424
-125
lines changed

packages/database/src/Builder/ModelInspector.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Tempest\Database\Relation;
1313
use Tempest\Database\Table;
1414
use Tempest\Database\Virtual;
15+
use Tempest\Mapper\SerializeAs;
1516
use Tempest\Mapper\SerializeWith;
1617
use Tempest\Reflection\ClassReflector;
1718
use Tempest\Reflection\PropertyReflector;
@@ -149,7 +150,11 @@ public function getBelongsTo(string $name): ?BelongsTo
149150
return null;
150151
}
151152

152-
if ($property->hasAttribute(SerializeWith::class) || $property->getType()->asClass()->haSAttribute(SerializeWith::class)) {
153+
if ($property->hasAttribute(SerializeWith::class) || $property->getType()->asClass()->hasAttribute(SerializeWith::class)) {
154+
return null;
155+
}
156+
157+
if ($property->getType()->asClass()->hasAttribute(SerializeAs::class)) {
153158
return null;
154159
}
155160

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
use function Tempest\Database\model;
1616

1717
/**
18-
* @template TModelClass of object
19-
* @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<TModelClass>
20-
* @uses \Tempest\Database\Builder\QueryBuilders\HasWhereQueryBuilderMethods<TModelClass>
18+
* @template T of object
19+
* @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<T>
20+
* @uses \Tempest\Database\Builder\QueryBuilders\HasWhereQueryBuilderMethods<T>
2121
*/
2222
final class CountQueryBuilder implements BuildsQuery
2323
{
@@ -29,11 +29,11 @@ final class CountQueryBuilder implements BuildsQuery
2929

3030
private ModelInspector $model;
3131

32-
public function __construct(
33-
/** @var class-string<TModelClass>|string|TModelClass $model */
34-
string|object $model,
35-
?string $column = null,
36-
) {
32+
/**
33+
* @param class-string<T>|string|T $model
34+
*/
35+
public function __construct(string|object $model, ?string $column = null)
36+
{
3737
$this->model = model($model);
3838

3939
$this->count = new CountStatement(
@@ -47,7 +47,7 @@ public function execute(mixed ...$bindings): int
4747
return $this->build()->fetchFirst(...$bindings)[$this->count->getKey()];
4848
}
4949

50-
/** @return self<TModelClass> */
50+
/** @return self<T> */
5151
public function distinct(): self
5252
{
5353
if ($this->count->column === null || $this->count->column === '*') {
@@ -59,7 +59,7 @@ public function distinct(): self
5959
return $this;
6060
}
6161

62-
/** @return self<TModelClass> */
62+
/** @return self<T> */
6363
public function bind(mixed ...$bindings): self
6464
{
6565
$this->bindings = [...$this->bindings, ...$bindings];

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ final class DeleteQueryBuilder implements BuildsQuery
2626

2727
private ModelInspector $model;
2828

29-
public function __construct(
30-
/** @var class-string<TModelClass>|string|TModelClass $model */
31-
string|object $model,
32-
) {
29+
/**
30+
* @param class-string<TModelClass>|string|TModelClass $model
31+
*/
32+
public function __construct(string|object $model)
33+
{
3334
$this->model = model($model);
3435
$this->delete = new DeleteStatement($this->model->getTableDefinition());
3536
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
use function Tempest\Database\model;
1919

20+
/**
21+
* @template T of object
22+
* @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<T>
23+
*/
2024
final class InsertQueryBuilder implements BuildsQuery
2125
{
2226
use HasConditions, OnDatabase;
@@ -29,8 +33,10 @@ final class InsertQueryBuilder implements BuildsQuery
2933

3034
private ModelInspector $model;
3135

36+
/**
37+
* @param class-string<T>|string|T $model
38+
*/
3239
public function __construct(
33-
/** @var class-string|string $model */
3440
string|object $model,
3541
private readonly array $rows,
3642
private readonly SerializerFactory $serializerFactory,

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,21 @@
77
use function Tempest\get;
88
use function Tempest\Support\arr;
99

10+
/**
11+
* @template T of object
12+
*/
1013
final readonly class QueryBuilder
1114
{
15+
/**
16+
* @param class-string<T>|string|T $model
17+
*/
1218
public function __construct(
1319
private string|object $model,
1420
) {}
1521

22+
/**
23+
* @return SelectQueryBuilder<T>
24+
*/
1625
public function select(string ...$columns): SelectQueryBuilder
1726
{
1827
return new SelectQueryBuilder(
@@ -21,6 +30,9 @@ public function select(string ...$columns): SelectQueryBuilder
2130
);
2231
}
2332

33+
/**
34+
* @return InsertQueryBuilder<T>
35+
*/
2436
public function insert(mixed ...$values): InsertQueryBuilder
2537
{
2638
if (! array_is_list($values)) {
@@ -34,6 +46,9 @@ public function insert(mixed ...$values): InsertQueryBuilder
3446
);
3547
}
3648

49+
/**
50+
* @return UpdateQueryBuilder<T>
51+
*/
3752
public function update(mixed ...$values): UpdateQueryBuilder
3853
{
3954
return new UpdateQueryBuilder(
@@ -43,11 +58,17 @@ public function update(mixed ...$values): UpdateQueryBuilder
4358
);
4459
}
4560

61+
/**
62+
* @return DeleteQueryBuilder<T>
63+
*/
4664
public function delete(): DeleteQueryBuilder
4765
{
4866
return new DeleteQueryBuilder($this->model);
4967
}
5068

69+
/**
70+
* @return CountQueryBuilder<T>
71+
*/
5172
public function count(?string $column = null): CountQueryBuilder
5273
{
5374
return new CountQueryBuilder(

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
use function Tempest\map;
2828

2929
/**
30-
* @template TModelClass of object
31-
* @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<TModelClass>
32-
* @uses \Tempest\Database\Builder\QueryBuilders\HasWhereQueryBuilderMethods<TModelClass>
30+
* @template T of object
31+
* @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<T>
32+
* @uses \Tempest\Database\Builder\QueryBuilders\HasWhereQueryBuilderMethods<T>
3333
*/
3434
final class SelectQueryBuilder implements BuildsQuery
3535
{
@@ -45,11 +45,11 @@ final class SelectQueryBuilder implements BuildsQuery
4545

4646
private array $bindings = [];
4747

48-
public function __construct(
49-
/** @var class-string<TModelClass>|string|TModelClass $model */
50-
string|object $model,
51-
?ImmutableArray $fields = null,
52-
) {
48+
/**
49+
* @param class-string<T>|string|T $model
50+
*/
51+
public function __construct(string|object $model, ?ImmutableArray $fields = null)
52+
{
5353
$this->model = model($model);
5454

5555
$this->select = new SelectStatement(
@@ -60,7 +60,7 @@ public function __construct(
6060
);
6161
}
6262

63-
/** @return TModelClass|null */
63+
/** @return T|null */
6464
public function first(mixed ...$bindings): mixed
6565
{
6666
$query = $this->build(...$bindings);
@@ -80,7 +80,7 @@ public function first(mixed ...$bindings): mixed
8080
return $result[array_key_first($result)];
8181
}
8282

83-
/** @return PaginatedData<TModelClass> */
83+
/** @return PaginatedData<T> */
8484
public function paginate(int $itemsPerPage = 20, int $currentPage = 1, int $maxLinks = 10): PaginatedData
8585
{
8686
$total = new CountQueryBuilder($this->model->model)->execute();
@@ -97,13 +97,13 @@ public function paginate(int $itemsPerPage = 20, int $currentPage = 1, int $maxL
9797
);
9898
}
9999

100-
/** @return TModelClass|null */
100+
/** @return T|null */
101101
public function get(Id $id): mixed
102102
{
103103
return $this->whereField('id', $id)->first();
104104
}
105105

106-
/** @return TModelClass[] */
106+
/** @return T[] */
107107
public function all(mixed ...$bindings): array
108108
{
109109
$query = $this->build(...$bindings);
@@ -118,7 +118,7 @@ public function all(mixed ...$bindings): array
118118
}
119119

120120
/**
121-
* @param Closure(TModelClass[] $models): void $closure
121+
* @param Closure(T[] $models): void $closure
122122
*/
123123
public function chunk(Closure $closure, int $amountPerChunk = 200): void
124124
{
@@ -136,23 +136,23 @@ public function chunk(Closure $closure, int $amountPerChunk = 200): void
136136
} while ($data !== []);
137137
}
138138

139-
/** @return self<TModelClass> */
139+
/** @return self<T> */
140140
public function orderBy(string $statement): self
141141
{
142142
$this->select->orderBy[] = new OrderByStatement($statement);
143143

144144
return $this;
145145
}
146146

147-
/** @return self<TModelClass> */
147+
/** @return self<T> */
148148
public function groupBy(string $statement): self
149149
{
150150
$this->select->groupBy[] = new GroupByStatement($statement);
151151

152152
return $this;
153153
}
154154

155-
/** @return self<TModelClass> */
155+
/** @return self<T> */
156156
public function having(string $statement, mixed ...$bindings): self
157157
{
158158
$this->select->having[] = new HavingStatement($statement);
@@ -162,47 +162,47 @@ public function having(string $statement, mixed ...$bindings): self
162162
return $this;
163163
}
164164

165-
/** @return self<TModelClass> */
165+
/** @return self<T> */
166166
public function limit(int $limit): self
167167
{
168168
$this->select->limit = $limit;
169169

170170
return $this;
171171
}
172172

173-
/** @return self<TModelClass> */
173+
/** @return self<T> */
174174
public function offset(int $offset): self
175175
{
176176
$this->select->offset = $offset;
177177

178178
return $this;
179179
}
180180

181-
/** @return self<TModelClass> */
181+
/** @return self<T> */
182182
public function join(string ...$joins): self
183183
{
184184
$this->joins = [...$this->joins, ...$joins];
185185

186186
return $this;
187187
}
188188

189-
/** @return self<TModelClass> */
189+
/** @return self<T> */
190190
public function with(string ...$relations): self
191191
{
192192
$this->relations = [...$this->relations, ...$relations];
193193

194194
return $this;
195195
}
196196

197-
/** @return self<TModelClass> */
197+
/** @return self<T> */
198198
public function raw(string $raw): self
199199
{
200200
$this->select->raw[] = new RawStatement($raw);
201201

202202
return $this;
203203
}
204204

205-
/** @return self<TModelClass> */
205+
/** @return self<T> */
206206
public function bind(mixed ...$bindings): self
207207
{
208208
$this->bindings = [...$this->bindings, ...$bindings];

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
use function Tempest\Support\arr;
1919

2020
/**
21-
* @template TModelClass of object
22-
* @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<TModelClass>
23-
* @uses \Tempest\Database\Builder\QueryBuilders\HasWhereQueryBuilderMethods<TModelClass>
21+
* @template T of object
22+
* @implements \Tempest\Database\Builder\QueryBuilders\BuildsQuery<T>
23+
* @uses \Tempest\Database\Builder\QueryBuilders\HasWhereQueryBuilderMethods<T>
2424
*/
2525
final class UpdateQueryBuilder implements BuildsQuery
2626
{
@@ -32,8 +32,10 @@ final class UpdateQueryBuilder implements BuildsQuery
3232

3333
private ModelInspector $model;
3434

35+
/**
36+
* @param class-string<T>|string|T $model
37+
*/
3538
public function __construct(
36-
/** @var class-string<TModelClass>|string|TModelClass $model */
3739
string|object $model,
3840
private readonly array|ImmutableArray $values,
3941
private readonly SerializerFactory $serializerFactory,
@@ -50,15 +52,15 @@ public function execute(mixed ...$bindings): ?Id
5052
return $this->build()->execute(...$bindings);
5153
}
5254

53-
/** @return self<TModelClass> */
55+
/** @return self<T> */
5456
public function allowAll(): self
5557
{
5658
$this->update->allowAll = true;
5759

5860
return $this;
5961
}
6062

61-
/** @return self<TModelClass> */
63+
/** @return self<T> */
6264
public function bind(mixed ...$bindings): self
6365
{
6466
$this->bindings = [...$this->bindings, ...$bindings];

packages/database/src/Mappers/SelectModelMapper.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ public function map(mixed $from, mixed $to): array
3030
$idField = $model->getPrimaryFieldName();
3131

3232
$parsed = arr($from)
33-
->groupBy(function (array $data) use ($idField) {
34-
return $data[$idField];
35-
})
33+
->groupBy(fn (array $data, int $i) => $data[$idField] ?? $i)
3634
->map(fn (array $rows) => $this->normalizeFields($model, $rows))
3735
->values();
3836

0 commit comments

Comments
 (0)