Skip to content

Commit afed151

Browse files
committed
- Added support for different text lengths
1 parent 187cc30 commit afed151

File tree

4 files changed

+106
-14
lines changed

4 files changed

+106
-14
lines changed

docs/limitations/supported-field-types.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ sidebar_position: 2
55

66
This package works by mapping database schema column types to a custom `Field` class. The supported field types and their corresponding database column types are given below.
77

8-
| Field Type | Column Types |
9-
|-----------------|--------------------------------------------------------------------------------|
10-
| BooleanField | `tinyint(1)` |
11-
| DateField | `date` |
12-
| DateTimeField | `datetime`, `timestamp` |
13-
| DecimalField | `double`, `decimal`, `dec`, `float` |
14-
| EnumField | `enum`, `set`, any column that has a comment in the format `enum:<EnumClass>` |
15-
| ForeignKeyField | `Foreign` |
16-
| IntegerField | `tinyint`, `smallint`, `mediumint`, `int`, `bigint` |
17-
| JsonField | `json` |
18-
| StringField | `varchar`, `char` |
19-
| TextField | `text` |
20-
| TimeField | `time` |
21-
| YearField | `year` |
8+
| Field Type | Column Types |
9+
|-----------------|-------------------------------------------------------------------------------|
10+
| BooleanField | `tinyint(1)` |
11+
| DateField | `date` |
12+
| DateTimeField | `datetime`, `timestamp` |
13+
| DecimalField | `double`, `decimal`, `dec`, `float` |
14+
| EnumField | `enum`, `set`, any column that has a comment in the format `enum:<EnumClass>` |
15+
| ForeignKeyField | `Foreign` |
16+
| IntegerField | `tinyint`, `smallint`, `mediumint`, `int`, `bigint` |
17+
| JsonField | `json` |
18+
| StringField | `varchar`, `char` |
19+
| TextField | `text`, `tinytext`, `mediumtext`, `longtext` |
20+
| TimeField | `time` |
21+
| YearField | `year` |
2222

2323
Currently, morphs and pivots are not supported. Any unsupported column type will simply be skipped by the generators.

src/Resolvers/SchemaResolverMySql.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ class SchemaResolverMySql extends BaseSchemaResolver implements SchemaResolverIn
4545
],
4646
];
4747

48+
public static array $textTypes = [
49+
'tinytext' => 255,
50+
'text' => 65535,
51+
'mediumtext' => 16777215,
52+
'longtext' => 4294967295,
53+
];
54+
4855
protected function getColumnsDefinitionsFromTable()
4956
{
5057
$databaseName = config('database.connections.mysql.database');
@@ -147,11 +154,23 @@ protected function resolveColumnFieldType(stdClass $column): ?Field
147154
);
148155
break;
149156

157+
case $type == 'tinytext':
158+
case $type == 'mediumtext':
159+
case $type == 'longtext':
150160
case $type == 'text':
161+
$text_type = $type->toString();
162+
163+
if (! array_key_exists($text_type, self::$textTypes)) {
164+
$text_type = 'text';
165+
}
166+
167+
$max = self::$textTypes[$text_type];
168+
151169
return new TextField(
152170
$name,
153171
$is_nullable,
154172
default: $default,
173+
max: $max,
155174
unique: $is_unique
156175
);
157176
break;

tests/TestSupport/database/2024_04_28_144113_create_posts_table.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public function up()
1717
$table->id();
1818
$table->string('title');
1919
$table->dateTime('published_at')->nullable();
20+
$table->text('excerpt');
21+
$table->longText('content')->nullable();
22+
$table->mediumText('medium_content')->nullable();
23+
$table->tinyText('tiny_content')->nullable();
2024
$table->timestamps();
2125
});
2226
}

tests/Unit/SchemaResolverMySqlTest.php

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Javaabu\Generators\FieldTypes\IntegerField;
1414
use Javaabu\Generators\FieldTypes\JsonField;
1515
use Javaabu\Generators\FieldTypes\StringField;
16+
use Javaabu\Generators\FieldTypes\TextField;
1617
use Javaabu\Generators\FieldTypes\TimeField;
1718
use Javaabu\Generators\FieldTypes\YearField;
1819
use Javaabu\Generators\Resolvers\SchemaResolverMySql;
@@ -81,6 +82,74 @@ public function it_does_not_resolve_auto_increments(): void
8182
$this->assertArrayNotHasKey('id', $fields);
8283
}
8384

85+
/** @test */
86+
public function it_can_resolve_text_fields(): void
87+
{
88+
$resolver = new SchemaResolverMySql('posts');
89+
$fields = $resolver->resolve()->getFields();
90+
91+
$this->assertArrayHasKey('excerpt', $fields);
92+
93+
$field = $fields['excerpt'];
94+
$this->assertInstanceOf(TextField::class, $field);
95+
$this->assertEquals('excerpt', $field->getName());
96+
$this->assertEquals(65535, $field->getMax());
97+
$this->assertFalse($field->isNullable());
98+
$this->assertFalse($field->hasDefault());
99+
$this->assertFalse($field->isUnique());
100+
}
101+
102+
/** @test */
103+
public function it_can_resolve_medium_text_fields(): void
104+
{
105+
$resolver = new SchemaResolverMySql('posts');
106+
$fields = $resolver->resolve()->getFields();
107+
108+
$this->assertArrayHasKey('medium_content', $fields);
109+
110+
$field = $fields['medium_content'];
111+
$this->assertInstanceOf(TextField::class, $field);
112+
$this->assertEquals('medium_content', $field->getName());
113+
$this->assertEquals(16777215, $field->getMax());
114+
$this->assertTrue($field->isNullable());
115+
$this->assertFalse($field->hasDefault());
116+
$this->assertFalse($field->isUnique());
117+
}
118+
119+
/** @test */
120+
public function it_can_resolve_tiny_text_fields(): void
121+
{
122+
$resolver = new SchemaResolverMySql('posts');
123+
$fields = $resolver->resolve()->getFields();
124+
125+
$this->assertArrayHasKey('tiny_content', $fields);
126+
127+
$field = $fields['tiny_content'];
128+
$this->assertInstanceOf(TextField::class, $field);
129+
$this->assertEquals('tiny_content', $field->getName());
130+
$this->assertEquals(255, $field->getMax());
131+
$this->assertTrue($field->isNullable());
132+
$this->assertFalse($field->hasDefault());
133+
$this->assertFalse($field->isUnique());
134+
}
135+
136+
/** @test */
137+
public function it_can_resolve_long_text_fields(): void
138+
{
139+
$resolver = new SchemaResolverMySql('posts');
140+
$fields = $resolver->resolve()->getFields();
141+
142+
$this->assertArrayHasKey('content', $fields);
143+
144+
$field = $fields['content'];
145+
$this->assertInstanceOf(TextField::class, $field);
146+
$this->assertEquals('content', $field->getName());
147+
$this->assertEquals(4294967295, $field->getMax());
148+
$this->assertTrue($field->isNullable());
149+
$this->assertFalse($field->hasDefault());
150+
$this->assertFalse($field->isUnique());
151+
}
152+
84153
/** @test */
85154
public function it_can_resolve_foreign_key_fields(): void
86155
{

0 commit comments

Comments
 (0)