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

tempestphp / tempest-framework / 14024978163

23 Mar 2025 05:55PM UTC coverage: 79.391% (-0.05%) from 79.441%
14024978163

push

github

web-flow
feat(view): cache Blade and Twig templates in internal storage (#1061)

2 of 2 new or added lines in 2 files covered. (100.0%)

912 existing lines in 110 files now uncovered.

10478 of 13198 relevant lines covered (79.39%)

91.09 hits per line

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

97.87
/src/Tempest/Database/src/QueryStatements/CreateTableStatement.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace Tempest\Database\QueryStatements;
6

7
use BackedEnum;
8
use Symfony\Component\VarDumper\Cloner\Data;
9
use Tempest\Database\Builder\TableName;
10
use Tempest\Database\Config\DatabaseDialect;
11
use Tempest\Database\QueryStatement;
12
use Tempest\Support\Str\ImmutableString;
13
use UnitEnum;
14

15
use function Tempest\Support\arr;
16
use function Tempest\Support\str;
17

18
final class CreateTableStatement implements QueryStatement
19
{
20
    public function __construct(
63✔
21
        private readonly string $tableName,
22
        private array $statements = [],
23
        private array $indexStatements = [],
24
    ) {
25
    }
63✔
26

27
    /** @param class-string<\Tempest\Database\DatabaseModel> $modelClass */
28
    public static function forModel(string $modelClass): self
22✔
29
    {
30
        return new self($modelClass::table()->tableName);
22✔
31
    }
32

33
    public function primary(string $name = 'id'): self
60✔
34
    {
35
        $this->statements[] = new PrimaryKeyStatement($name);
60✔
36

37
        return $this;
60✔
38
    }
39

40
    public function belongsTo(
35✔
41
        string $local,
42
        string $foreign,
43
        OnDelete $onDelete = OnDelete::RESTRICT,
44
        OnUpdate $onUpdate = OnUpdate::NO_ACTION,
45
        bool $nullable = false,
46
    ): self {
47
        [, $localKey] = explode('.', $local);
35✔
48

49
        $this->integer($localKey, nullable: $nullable);
35✔
50

51
        $this->statements[] = new BelongsToStatement(
35✔
52
            local: $local,
35✔
53
            foreign: $foreign,
35✔
54
            onDelete: $onDelete,
35✔
55
            onUpdate: $onUpdate,
35✔
56
        );
35✔
57

58
        return $this;
35✔
59
    }
60

61
    public function text(
57✔
62
        string $name,
63
        bool $nullable = false,
64
        ?string $default = null,
65
    ): self {
66
        $this->statements[] = new TextStatement(
57✔
67
            name: $name,
57✔
68
            nullable: $nullable,
57✔
69
            default: $default,
57✔
70
        );
57✔
71

72
        return $this;
57✔
73
    }
74

75
    public function varchar(
17✔
76
        string $name,
77
        int $length = 255,
78
        bool $nullable = false,
79
        ?string $default = null,
80
    ): self {
81
        $this->statements[] = new VarcharStatement(
17✔
82
            name: $name,
17✔
83
            size: $length,
17✔
84
            nullable: $nullable,
17✔
85
            default: $default,
17✔
86
        );
17✔
87

88
        return $this;
17✔
89
    }
90

91
    public function char(
1✔
92
        string $name,
93
        bool $nullable = false,
94
        ?string $default = null,
95
    ): self {
96
        $this->statements[] = new CharStatement(
1✔
97
            name: $name,
1✔
98
            nullable: $nullable,
1✔
99
            default: $default,
1✔
100
        );
1✔
101

102
        return $this;
1✔
103
    }
104

105
    public function integer(
36✔
106
        string $name,
107
        bool $unsigned = false,
108
        bool $nullable = false,
109
        ?int $default = null,
110
    ): self {
111
        $this->statements[] = new IntegerStatement(
36✔
112
            name: $name,
36✔
113
            unsigned: $unsigned,
36✔
114
            nullable: $nullable,
36✔
115
            default: $default,
36✔
116
        );
36✔
117

118
        return $this;
36✔
119
    }
120

121
    public function float(
1✔
122
        string $name,
123
        bool $nullable = false,
124
        ?float $default = null,
125
    ): self {
126
        $this->statements[] = new FloatStatement(
1✔
127
            name: $name,
1✔
128
            nullable: $nullable,
1✔
129
            default: $default,
1✔
130
        );
1✔
131

132
        return $this;
1✔
133
    }
134

135
    public function datetime(
11✔
136
        string $name,
137
        bool $nullable = false,
138
        ?string $default = null,
139
    ): self {
140
        $this->statements[] = new DatetimeStatement(
11✔
141
            name: $name,
11✔
142
            nullable: $nullable,
11✔
143
            default: $default,
11✔
144
        );
11✔
145

146
        return $this;
11✔
147
    }
148

149
    public function date(
1✔
150
        string $name,
151
        bool $nullable = false,
152
        ?string $default = null,
153
    ): self {
154
        $this->statements[] = new DateStatement(
1✔
155
            name: $name,
1✔
156
            nullable: $nullable,
1✔
157
            default: $default,
1✔
158
        );
1✔
159

160
        return $this;
1✔
161
    }
162

163
    public function boolean(
1✔
164
        string $name,
165
        bool $nullable = false,
166
        ?bool $default = null,
167
    ): self {
168
        $this->statements[] = new BooleanStatement(
1✔
169
            name: $name,
1✔
170
            nullable: $nullable,
1✔
171
            default: $default,
1✔
172
        );
1✔
173

174
        return $this;
1✔
175
    }
176

177
    public function json(
2✔
178
        string $name,
179
        bool $nullable = false,
180
        ?string $default = null,
181
    ): self {
182
        $this->statements[] = new JsonStatement(
2✔
183
            name: $name,
2✔
184
            nullable: $nullable,
2✔
185
            default: $default,
2✔
186
        );
2✔
187

188
        return $this;
2✔
189
    }
190

191
    public function array(
2✔
192
        string $name,
193
        bool $nullable = false,
194
        array $default = [],
195
    ): self {
196
        $this->statements[] = new JsonStatement(
2✔
197
            name: $name,
2✔
198
            nullable: $nullable,
2✔
199
            default: json_encode($default),
2✔
200
        );
2✔
201

202
        return $this;
2✔
203
    }
204

205
    public function enum(
2✔
206
        string $name,
207
        string $enumClass,
208
        bool $nullable = false,
209
        null|UnitEnum|BackedEnum $default = null,
210
    ): self {
211
        $this->statements[] = new CreateEnumTypeStatement($enumClass);
2✔
212

213
        $this->statements[] = new EnumStatement(
2✔
214
            name: $name,
2✔
215
            enumClass: $enumClass,
2✔
216
            nullable: $nullable,
2✔
217
            default: $default,
2✔
218
        );
2✔
219

220
        return $this;
2✔
221
    }
222

223
    public function set(
2✔
224
        string $name,
225
        array $values,
226
        bool $nullable = false,
227
        ?string $default = null,
228
    ): self {
229
        $this->statements[] = new SetStatement(
2✔
230
            name: $name,
2✔
231
            values: $values,
2✔
232
            nullable: $nullable,
2✔
233
            default: $default,
2✔
234
        );
2✔
235

236
        return $this;
2✔
237
    }
238

239
    public function unique(string ...$columns): self
1✔
240
    {
241
        $this->indexStatements[] = new UniqueStatement(
1✔
242
            tableName: $this->tableName,
1✔
243
            columns: $columns,
1✔
244
        );
1✔
245

246
        return $this;
1✔
247
    }
248

249
    public function index(string ...$columns): self
1✔
250
    {
251
        $this->indexStatements[] = new IndexStatement(
1✔
252
            tableName: $this->tableName,
1✔
253
            columns: $columns,
1✔
254
        );
1✔
255

256
        return $this;
1✔
257
    }
258

UNCOV
259
    public function raw(string $statement): self
×
260
    {
UNCOV
261
        $this->statements[] = new RawStatement($statement);
×
262

UNCOV
263
        return $this;
×
264
    }
265

266
    public function compile(DatabaseDialect $dialect): string
63✔
267
    {
268
        $createTable = sprintf(
63✔
269
            'CREATE TABLE %s (%s);',
63✔
270
            new TableName($this->tableName),
63✔
271
            arr($this->statements)
63✔
272
                // Remove BelongsTo for sqlLite as it does not support those queries
63✔
273
                ->filter(fn (QueryStatement $queryStatement) => ! ($dialect === DatabaseDialect::SQLITE && $queryStatement instanceof BelongsToStatement))
63✔
274
                ->map(fn (QueryStatement $queryStatement) => str($queryStatement->compile($dialect))->trim()->replace('  ', ' '))
63✔
275
                ->filter(fn (ImmutableString $str) => $str->isNotEmpty())
63✔
276
                ->implode(', ' . PHP_EOL . '    ')
63✔
277
                ->wrap(before: PHP_EOL . '    ', after: PHP_EOL)
63✔
278
                ->toString(),
63✔
279
        );
63✔
280

281
        if ($this->indexStatements !== []) {
63✔
282
            $createIndices = PHP_EOL . arr($this->indexStatements)
1✔
283
                ->map(fn (QueryStatement $queryStatement) => str($queryStatement->compile($dialect))->trim()->replace('  ', ' '))
1✔
284
                ->implode(';' . PHP_EOL)
1✔
285
                ->append(';');
1✔
286
        } else {
287
            $createIndices = '';
63✔
288
        }
289

290
        return $createTable . $createIndices;
63✔
291
    }
292
}
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