• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tempestphp / tempest-framework / 14104093847

27 Mar 2025 10:15AM UTC coverage: 79.581% (+0.2%) from 79.334%
14104093847

Pull #1076

github

web-flow
Merge 90e1ee638 into 6af05d563
Pull Request #1076: refactor(database): remove `DatabaseModel` interface

471 of 480 new or added lines in 34 files covered. (98.13%)

1 existing line in 1 file now uncovered.

10679 of 13419 relevant lines covered (79.58%)

92.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

93.94
/src/Tempest/Database/src/Builder/QueryBuilders/UpdateQueryBuilder.php
1
<?php
2

3
namespace Tempest\Database\Builder\QueryBuilders;
4

5
use Tempest\Database\Builder\ModelDefinition;
6
use Tempest\Database\Id;
7
use Tempest\Database\Query;
8
use Tempest\Mapper\SerializerFactory;
9
use Tempest\Reflection\ClassReflector;
10

11
/**
12
 * @template TModelClass of object
13
 */
14
final readonly class UpdateQueryBuilder
15
{
16
    public function __construct(
5✔
17
        private object $model,
18
        private SerializerFactory $serializerFactory,
19
    ) {}
5✔
20

NEW
21
    public function execute(...$bindings): Id
×
22
    {
NEW
23
        return $this->build()->execute(...$bindings);
×
24
    }
25

26
    public function build(): Query
5✔
27
    {
28
        $modelClass = new ClassReflector($this->model);
5✔
29
        $modelDefinition = new ModelDefinition($this->model);
5✔
30

31
        $fields = $this->fields($modelClass, $this->model);
5✔
32

33
        unset($fields['id']);
5✔
34

35
        $values = implode(', ', array_map(
5✔
36
            fn (string $key) => "{$key} = :{$key}",
5✔
37
            array_keys($fields),
5✔
38
        ));
5✔
39

40
        // TODO: update relations?
41

42
        $fields['id'] = $this->model->id;
5✔
43

44
        $table = $modelDefinition->getTableDefinition();
5✔
45

46
        return new Query(
5✔
47
            "UPDATE {$table} SET {$values} WHERE id = :id;",
5✔
48
            $fields,
5✔
49
        );
5✔
50
    }
51

52
    private function fields(ClassReflector $modelClass, object $model): array
5✔
53
    {
54
        $fields = [];
5✔
55

56
        foreach ($modelClass->getPublicProperties() as $property) {
5✔
57
            if (! $property->isInitialized($model)) {
5✔
58
                continue;
1✔
59
            }
60

61
            // 1:1 or n:1 relations
62
            if ($property->getType()->isRelation()) {
5✔
63
                continue;
1✔
64
            }
65

66
            // 1:n relations
67
            if ($property->getIterableType()?->isRelation()) {
5✔
68
                continue;
2✔
69
            }
70

71
            $value = $property->getValue($model);
5✔
72

73
            // Check if serializer is available for value serialization
74
            if ($value !== null && ($serializer = $this->serializerFactory->forProperty($property))) {
5✔
75
                $value = $serializer->serialize($value);
5✔
76
            }
77

78
            $fields[$property->getName()] = $value;
5✔
79
        }
80

81
        return $fields;
5✔
82
    }
83
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc