44
55namespace Tempest \Database \QueryStatements ;
66
7+ use BackedEnum ;
78use Tempest \Database \Builder \TableName ;
89use Tempest \Database \DatabaseDialect ;
910use Tempest \Database \QueryStatement ;
1011use Tempest \Support \StringHelper ;
12+ use UnitEnum ;
1113use function Tempest \Support \arr ;
1214use function Tempest \Support \str ;
1315
@@ -17,8 +19,7 @@ public function __construct(
1719 private readonly string $ tableName ,
1820 private array $ statements = [],
1921 private array $ indexStatements = [],
20- ) {
21- }
22+ ) {}
2223
2324 /** @param class-string<\Tempest\Database\DatabaseModel> $modelClass */
2425 public static function forModel (string $ modelClass ): self
@@ -39,7 +40,8 @@ public function belongsTo(
3940 OnDelete $ onDelete = OnDelete::RESTRICT ,
4041 OnUpdate $ onUpdate = OnUpdate::NO_ACTION ,
4142 bool $ nullable = false ,
42- ): self {
43+ ): self
44+ {
4345 [$ localTable , $ localKey ] = explode ('. ' , $ local );
4446
4547 $ this ->integer ($ localKey , nullable: $ nullable );
@@ -58,7 +60,8 @@ public function text(
5860 string $ name ,
5961 bool $ nullable = false ,
6062 ?string $ default = null ,
61- ): self {
63+ ): self
64+ {
6265 $ this ->statements [] = new TextStatement (
6366 name: $ name ,
6467 nullable: $ nullable ,
@@ -73,7 +76,8 @@ public function varchar(
7376 int $ length = 255 ,
7477 bool $ nullable = false ,
7578 ?string $ default = null ,
76- ): self {
79+ ): self
80+ {
7781 $ this ->statements [] = new VarcharStatement (
7882 name: $ name ,
7983 size: $ length ,
@@ -88,7 +92,8 @@ public function char(
8892 string $ name ,
8993 bool $ nullable = false ,
9094 ?string $ default = null ,
91- ): self {
95+ ): self
96+ {
9297 $ this ->statements [] = new CharStatement (
9398 name: $ name ,
9499 nullable: $ nullable ,
@@ -103,7 +108,8 @@ public function integer(
103108 bool $ unsigned = false ,
104109 bool $ nullable = false ,
105110 ?int $ default = null ,
106- ): self {
111+ ): self
112+ {
107113 $ this ->statements [] = new IntegerStatement (
108114 name: $ name ,
109115 unsigned: $ unsigned ,
@@ -118,7 +124,8 @@ public function float(
118124 string $ name ,
119125 bool $ nullable = false ,
120126 ?float $ default = null ,
121- ): self {
127+ ): self
128+ {
122129 $ this ->statements [] = new FloatStatement (
123130 name: $ name ,
124131 nullable: $ nullable ,
@@ -132,7 +139,8 @@ public function datetime(
132139 string $ name ,
133140 bool $ nullable = false ,
134141 ?string $ default = null ,
135- ): self {
142+ ): self
143+ {
136144 $ this ->statements [] = new DatetimeStatement (
137145 name: $ name ,
138146 nullable: $ nullable ,
@@ -146,7 +154,8 @@ public function date(
146154 string $ name ,
147155 bool $ nullable = false ,
148156 ?string $ default = null ,
149- ): self {
157+ ): self
158+ {
150159 $ this ->statements [] = new DateStatement (
151160 name: $ name ,
152161 nullable: $ nullable ,
@@ -160,7 +169,8 @@ public function boolean(
160169 string $ name ,
161170 bool $ nullable = false ,
162171 ?bool $ default = null ,
163- ): self {
172+ ): self
173+ {
164174 $ this ->statements [] = new BooleanStatement (
165175 name: $ name ,
166176 nullable: $ nullable ,
@@ -174,10 +184,45 @@ public function json(
174184 string $ name ,
175185 bool $ nullable = false ,
176186 ?string $ default = null ,
177- ): self {
187+ ): self
188+ {
189+ $ this ->statements [] = new JsonStatement (
190+ name: $ name ,
191+ nullable: $ nullable ,
192+ default: $ default ,
193+ );
194+
195+ return $ this ;
196+ }
197+
198+ public function array (
199+ string $ name ,
200+ bool $ nullable = false ,
201+ array $ default = [],
202+ ): self
203+ {
178204 $ this ->statements [] = new JsonStatement (
179205 name: $ name ,
180206 nullable: $ nullable ,
207+ default: json_encode ($ default ),
208+ );
209+
210+ return $ this ;
211+ }
212+
213+ public function enum (
214+ string $ name ,
215+ string $ enumClass ,
216+ bool $ nullable = false ,
217+ null |UnitEnum |BackedEnum $ default = null ,
218+ ): self
219+ {
220+ $ this ->statements [] = new CreateEnumTypeStatement ($ enumClass );
221+
222+ $ this ->statements [] = new EnumStatement (
223+ name: $ name ,
224+ enumClass: $ enumClass ,
225+ nullable: $ nullable ,
181226 default: $ default ,
182227 );
183228
@@ -189,7 +234,8 @@ public function set(
189234 array $ values ,
190235 bool $ nullable = false ,
191236 ?string $ default = null ,
192- ): self {
237+ ): self
238+ {
193239 $ this ->statements [] = new SetStatement (
194240 name: $ name ,
195241 values: $ values ,
@@ -242,9 +288,9 @@ public function compile(DatabaseDialect $dialect): string
242288
243289 if ($ this ->indexStatements !== []) {
244290 $ createIndices = PHP_EOL . arr ($ this ->indexStatements )
245- ->map (fn (QueryStatement $ queryStatement ) => str ($ queryStatement ->compile ($ dialect ))->trim ()->replace (' ' , ' ' ))
246- ->implode ('; ' . PHP_EOL )
247- ->append ('; ' );
291+ ->map (fn (QueryStatement $ queryStatement ) => str ($ queryStatement ->compile ($ dialect ))->trim ()->replace (' ' , ' ' ))
292+ ->implode ('; ' . PHP_EOL )
293+ ->append ('; ' );
248294 } else {
249295 $ createIndices = '' ;
250296 }
0 commit comments