Skip to content

Commit fecabdc

Browse files
Rework all known column data types (#268)
1 parent 32d65f6 commit fecabdc

File tree

7 files changed

+207
-17
lines changed

7 files changed

+207
-17
lines changed

src/Generators/FactoryGenerator.php

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ protected function buildDefinition(Model $model)
7777
continue;
7878
}
7979

80+
if (Str::startsWith($column->dataType(), 'nullable')) {
81+
continue;
82+
}
83+
8084
$foreign = $column->isForeignKey();
8185
if ($foreign) {
8286
$table = Str::beforeLast($column->name(), '_id');
@@ -109,7 +113,7 @@ protected function buildDefinition(Model $model)
109113
$definition .= PHP_EOL;
110114
$definition .= self::INDENT . '},' . PHP_EOL;
111115
}
112-
} elseif (in_array($column->dataType(), ['id', 'uuid'])) {
116+
} elseif ($column->dataType() === 'id' || ($column->dataType() === 'uuid' && Str::endsWith($column->name(), '_id'))) {
113117
$name = Str::beforeLast($column->name(), '_id');
114118
$class = Str::studly($column->attributes()[0] ?? $name);
115119

@@ -140,7 +144,7 @@ protected function buildDefinition(Model $model)
140144
implode(', ', [$scale, 0, (str_repeat(9, $precision - $scale) . '.' . str_repeat(9, $scale))]),
141145
$definition
142146
);
143-
} elseif ($column->dataType() === 'json') {
147+
} elseif (in_array($column->dataType(), ['json', 'jsonb'])) {
144148
$default = $column->defaultValue() ?? "'{}'";
145149
$definition .= self::INDENT . "'{$column->name()}' => {$default}," . PHP_EOL;
146150
} elseif ($column->dataType() === 'morphs') {
@@ -156,7 +160,18 @@ protected function buildDefinition(Model $model)
156160
$definition .= ',' . PHP_EOL;
157161
} else {
158162
$definition .= self::INDENT . "'{$column->name()}' => ";
159-
$faker = self::fakerData($column->name()) ?? self::fakerDataType($column->dataType());
163+
164+
$type = $column->dataType();
165+
if ($column->isUnsigned()) {
166+
$type = 'unsigned' . $type;
167+
}
168+
169+
$faker = self::fakerData($column->name()) ?? (self::fakerDataType($type) ?? self::fakerDataType($column->dataType()));
170+
171+
if ($faker === null) {
172+
$faker = 'word';
173+
}
174+
160175
$definition .= '$faker->' . $faker;
161176
$definition .= ',' . PHP_EOL;
162177
}
@@ -235,29 +250,57 @@ public static function fakerData(string $name)
235250
public static function fakerDataType(string $type)
236251
{
237252
$fakeableTypes = [
238-
'biginteger' => 'randomNumber()',
253+
'biginteger' => 'numberBetween(-100000, 100000)',
254+
'binary' => 'sha256',
239255
'boolean' => 'boolean',
256+
'char' => 'randomLetter',
240257
'date' => 'date()',
241258
'datetime' => 'dateTime()',
242259
'datetimetz' => 'dateTime()',
243260
'decimal' => 'randomFloat(/** decimal_attributes **/)',
244261
'double' => 'randomFloat(/** double_attributes **/)',
245262
'enum' => 'randomElement(/** enum_attributes **/)',
246263
'float' => 'randomFloat(/** float_attributes **/)',
264+
'geometry' => 'word',
265+
'geometrycollection' => 'word',
247266
'guid' => 'uuid',
248267
'id' => 'randomDigitNotNull',
249-
'integer' => 'randomNumber()',
268+
'integer' => 'numberBetween(-10000, 10000)',
269+
'ipaddress' => 'ipv4',
270+
'linestring' => 'word',
250271
'longtext' => 'text',
272+
'macaddress' => 'macAddress',
273+
'mediuminteger' => 'numberBetween(-10000, 10000)',
274+
'mediumtext' => 'text',
275+
'morphs_id' => 'randomDigitNotNull',
276+
'morphs_type' => 'word',
277+
'multilinestring' => 'word',
278+
'multipoint' => 'word',
279+
'multipolygon' => 'word',
280+
'nullablemorphs' => null,
281+
'nullabletimestamps' => null,
282+
'nullableuuidmorphs' => null,
283+
'point' => 'word',
284+
'polygon' => 'word',
251285
'set' => 'randomElement(/** set_attributes **/)',
252-
'smallint' => 'randomNumber()',
253-
'smallinteger' => 'randomNumber()',
286+
'smallint' => 'numberBetween(-1000, 1000)',
287+
'smallinteger' => 'numberBetween(-1000, 1000)',
254288
'string' => 'word',
255289
'text' => 'text',
256290
'time' => 'time()',
257291
'timestamp' => 'dateTime()',
258-
'tinyinteger' => 'randomNumber()',
259-
'unsignedsmallinteger' => 'randomDigitNotNull',
292+
'timestamptz' => 'dateTime()',
293+
'timetz' => 'time()',
294+
'tinyinteger' => 'numberBetween(-8, 8)',
295+
'unsignedbiginteger' => 'randomNumber()',
296+
'unsigneddecimal' => 'randomNumber()',
297+
'unsignedinteger' => 'randomNumber()',
298+
'unsignedmediuminteger' => 'randomNumber()',
299+
'unsignedsmallinteger' => 'randomNumber()',
300+
'unsignedtinyinteger' => 'randomDigitNotNull',
260301
'uuid' => 'uuid',
302+
'uuidmorphs' => 'word',
303+
'year' => 'year()',
261304
];
262305

263306
return $fakeableTypes[strtolower($type)] ?? null;

src/Models/Column.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,9 @@ public function isNullable()
5757
{
5858
return in_array('nullable', $this->modifiers);
5959
}
60+
61+
public function isUnsigned()
62+
{
63+
return in_array('unsigned', $this->modifiers);
64+
}
6065
}

tests/Feature/Generator/FactoryGeneratorTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ public function modelTreeDataProvider()
153153
['drafts/foreign-key-shorthand.yaml', 'database/factories/CommentFactory.php', 'factories/foreign-key-shorthand.php'],
154154
['drafts/resource-statements.yaml', 'database/factories/UserFactory.php', 'factories/resource-statements.php'],
155155
['drafts/factory-smallint-and-tinyint.yaml', 'database/factories/ModelFactory.php', 'factories/factory-smallint-and-tinyint.php'],
156+
['drafts/all-column-types.yaml', 'database/factories/AllTypeFactory.php', 'factories/all-column-types.php'],
156157
];
157158
}
158159
}

tests/Unit/Generators/FactoryGeneratorTest.php

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,29 +70,57 @@ public function commonNameDataProvider()
7070
public function dataTypeDataProvider()
7171
{
7272
return [
73-
['biginteger', 'randomNumber()'],
73+
['biginteger', 'numberBetween(-100000, 100000)'],
74+
['binary', 'sha256'],
7475
['boolean', 'boolean'],
76+
['char', 'randomLetter'],
7577
['date', 'date()'],
7678
['datetime', 'dateTime()'],
7779
['datetimetz', 'dateTime()'],
78-
['double', 'randomFloat(/** double_attributes **/)'],
7980
['decimal', 'randomFloat(/** decimal_attributes **/)'],
81+
['double', 'randomFloat(/** double_attributes **/)'],
8082
['enum', 'randomElement(/** enum_attributes **/)'],
8183
['float', 'randomFloat(/** float_attributes **/)'],
84+
['geometry', 'word'],
85+
['geometrycollection', 'word'],
8286
['guid', 'uuid'],
8387
['id', 'randomDigitNotNull'],
84-
['integer', 'randomNumber()'],
88+
['integer', 'numberBetween(-10000, 10000)'],
89+
['ipaddress', 'ipv4'],
90+
['linestring', 'word'],
8591
['longtext', 'text'],
92+
['macaddress', 'macAddress'],
93+
['mediuminteger', 'numberBetween(-10000, 10000)'],
94+
['mediumtext', 'text'],
95+
['morphs_id', 'randomDigitNotNull'],
96+
['morphs_type', 'word'],
97+
['multilinestring', 'word'],
98+
['multipoint', 'word'],
99+
['multipolygon', 'word'],
100+
['nullablemorphs', null],
101+
['nullabletimestamps', null],
102+
['nullableuuidmorphs', null],
103+
['point', 'word'],
104+
['polygon', 'word'],
86105
['set', 'randomElement(/** set_attributes **/)'],
87-
['smallint', 'randomNumber()'],
88-
['smallinteger', 'randomNumber()'],
106+
['smallint', 'numberBetween(-1000, 1000)'],
107+
['smallinteger', 'numberBetween(-1000, 1000)'],
89108
['string', 'word'],
90109
['text', 'text'],
91110
['time', 'time()'],
92111
['timestamp', 'dateTime()'],
93-
['tinyinteger', 'randomNumber()'],
94-
['unsignedsmallinteger', 'randomDigitNotNull'],
112+
['timestamptz', 'dateTime()'],
113+
['timetz', 'time()'],
114+
['tinyinteger', 'numberBetween(-8, 8)'],
115+
['unsignedbiginteger', 'randomNumber()'],
116+
['unsigneddecimal', 'randomNumber()'],
117+
['unsignedinteger', 'randomNumber()'],
118+
['unsignedmediuminteger', 'randomNumber()'],
119+
['unsignedsmallinteger', 'randomNumber()'],
120+
['unsignedtinyinteger', 'randomDigitNotNull'],
95121
['uuid', 'uuid'],
122+
['uuidmorphs', 'word'],
123+
['year', 'year()'],
96124
];
97125
}
98126
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
models:
2+
AllType:
3+
id: bigIncrements
4+
bigInteger: bigInteger
5+
binary: binary
6+
boolean: boolean
7+
char: char
8+
date: date
9+
dateTime: dateTime
10+
dateTimeTz: dateTimeTz
11+
decimal: decimal
12+
double: double
13+
enum: enum:1,2,3
14+
float: float
15+
geometry: geometry
16+
geometryCollection: geometryCollection
17+
integer: integer
18+
ipAddress: ipAddress
19+
json: json
20+
jsonb: jsonb
21+
lineString: lineString
22+
longText: longText
23+
macAddress: macAddress
24+
mediumInteger: mediumInteger
25+
mediumText: mediumText
26+
morphs: morphs
27+
uuidMorphs: uuidMorphs
28+
multiLineString: multiLineString
29+
multiPoint: multiPoint
30+
multiPolygon: multiPolygon
31+
nullableMorphs: nullableMorphs
32+
nullableUuidMorphs: nullableUuidMorphs
33+
nullableTimestamps: nullableTimestamps
34+
point: point
35+
polygon: polygon
36+
rememberToken: rememberToken
37+
set: set:1,2,3
38+
smallInteger: smallInteger
39+
string: string
40+
text: text
41+
time: time
42+
timeTz: timeTz
43+
timestamp: timestamp
44+
timestampTz: timestampTz
45+
tinyInteger: tinyInteger
46+
unsignedBigInteger: unsignedBigInteger
47+
unsignedDecimal: unsignedDecimal
48+
unsignedInteger: unsignedInteger
49+
unsignedMediumInteger: unsignedMediumInteger
50+
unsignedSmallInteger: unsignedSmallInteger
51+
unsignedTinyInteger: unsignedTinyInteger
52+
uuid: uuid
53+
year: year
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
/** @var \Illuminate\Database\Eloquent\Factory $factory */
4+
5+
use App\AllType;
6+
use Faker\Generator as Faker;
7+
use Illuminate\Support\Str;
8+
9+
$factory->define(AllType::class, function (Faker $faker) {
10+
return [
11+
'bigInteger' => $faker->numberBetween(-100000, 100000),
12+
'binary' => $faker->sha256,
13+
'boolean' => $faker->boolean,
14+
'char' => $faker->randomLetter,
15+
'date' => $faker->date(),
16+
'dateTime' => $faker->dateTime(),
17+
'dateTimeTz' => $faker->dateTime(),
18+
'decimal' => $faker->randomFloat(0, 0, 9999999999.),
19+
'double' => $faker->randomFloat(0, 0, 9999999999.),
20+
'enum' => $faker->randomElement(["1","2","3"]),
21+
'float' => $faker->randomFloat(0, 0, 9999999999.),
22+
'geometry' => $faker->word,
23+
'geometryCollection' => $faker->word,
24+
'integer' => $faker->numberBetween(-10000, 10000),
25+
'ipAddress' => $faker->ipv4,
26+
'json' => '{}',
27+
'jsonb' => '{}',
28+
'lineString' => $faker->word,
29+
'longText' => $faker->text,
30+
'macAddress' => $faker->macAddress,
31+
'mediumInteger' => $faker->numberBetween(-10000, 10000),
32+
'mediumText' => $faker->text,
33+
'morphs_id' => $faker->randomDigitNotNull,
34+
'morphs_type' => $faker->word,
35+
'uuidMorphs' => $faker->word,
36+
'multiLineString' => $faker->word,
37+
'multiPoint' => $faker->word,
38+
'multiPolygon' => $faker->word,
39+
'point' => $faker->word,
40+
'polygon' => $faker->word,
41+
'rememberToken' => Str::random(10),
42+
'set' => $faker->randomElement(["1","2","3"]),
43+
'smallInteger' => $faker->numberBetween(-1000, 1000),
44+
'string' => $faker->word,
45+
'text' => $faker->text,
46+
'time' => $faker->time(),
47+
'timeTz' => $faker->time(),
48+
'timestamp' => $faker->dateTime(),
49+
'timestampTz' => $faker->dateTime(),
50+
'tinyInteger' => $faker->numberBetween(-8, 8),
51+
'unsignedBigInteger' => $faker->randomNumber(),
52+
'unsignedDecimal' => $faker->randomNumber(),
53+
'unsignedInteger' => $faker->randomNumber(),
54+
'unsignedMediumInteger' => $faker->randomNumber(),
55+
'unsignedSmallInteger' => $faker->randomNumber(),
56+
'unsignedTinyInteger' => $faker->randomDigitNotNull,
57+
'uuid' => $faker->uuid,
58+
'year' => $faker->year(),
59+
];
60+
});

tests/fixtures/factories/factory-smallint-and-tinyint.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
$factory->define(Model::class, function (Faker $faker) {
99
return [
10-
'market_type' => $faker->randomNumber(),
10+
'market_type' => $faker->numberBetween(-8, 8),
1111
'deposit' => $faker->randomNumber(),
1212
];
1313
});

0 commit comments

Comments
 (0)