diff --git a/src/Generators/FactoryGenerator.php b/src/Generators/FactoryGenerator.php index 586de3e9..cdbec4b3 100644 --- a/src/Generators/FactoryGenerator.php +++ b/src/Generators/FactoryGenerator.php @@ -74,15 +74,35 @@ protected function buildDefinition(Model $model) $definition .= self::INDENT . "'{$column->name()}' => "; $definition .= sprintf("factory(%s::class)", '\\' . $model->fullyQualifiedNamespace() . '\\' . $class); $definition .= ',' . PHP_EOL; - } else { + } else if(in_array($column->dataType(), ['enum', 'set']) and !empty($column->attributes())){ + $definition .= self::INDENT . "'{$column->name()}' => "; + $faker = $this->fakerData($column->name()) ?? $this->fakerDataType($column->dataType()); + $definition .= '$faker->' . $faker; + $definition .= ',' . PHP_EOL; + $definition = str_replace( + "/** {$column->dataType()}_attributes **/", + json_encode($column->attributes()), + $definition + ); + } else if (in_array($column->dataType(), ['decimal', 'float'])) { $definition .= self::INDENT . "'{$column->name()}' => "; $faker = $this->fakerData($column->name()) ?? $this->fakerDataType($column->dataType()); $definition .= '$faker->' . $faker; $definition .= ',' . PHP_EOL; - if (in_array($column->dataType(), ['enum', 'set']) and !empty($column->attributes())) { - $definition = str_replace("/** {$column->dataType()}_attributes **/", json_encode($column->attributes()), $definition); - } + $precision = min([65, intval($column->attributes()[0] ?? 10)]); + $scale = min([30, max([0, intval($column->attributes()[1] ?? 0)])]); + + $definition = str_replace( + "/** {$column->dataType()}_attributes **/", + implode(', ', [$precision, 0, (intval(str_repeat(9, $precision)) / pow(10, $scale))]), + $definition + ); + } else { + $definition .= self::INDENT . "'{$column->name()}' => "; + $faker = $this->fakerData($column->name()) ?? $this->fakerDataType($column->dataType()); + $definition .= '$faker->' . $faker; + $definition .= ',' . PHP_EOL; } } @@ -145,8 +165,8 @@ protected function fakerDataType(string $type) 'integer' => 'randomNumber()', 'bigint' => 'randomNumber()', 'smallint' => 'randomNumber()', - 'decimal' => 'randomFloat()', - 'float' => 'randomFloat()', + 'decimal' => 'randomFloat(/** decimal_attributes **/)', + 'float' => 'randomFloat(/** float_attributes **/)', 'longtext' => 'text', 'boolean' => 'boolean', 'set' => 'randomElement(/** set_attributes **/)', diff --git a/tests/fixtures/definitions/model-modifiers.bp b/tests/fixtures/definitions/model-modifiers.bp index 2b399541..e27416bc 100644 --- a/tests/fixtures/definitions/model-modifiers.bp +++ b/tests/fixtures/definitions/model-modifiers.bp @@ -3,6 +3,7 @@ models: title: string nullable name: string:1000 unique charset:'utf8' content: string default:'' + amount: float:9,3 total: decimal:10,2 ssn: char:11 role: enum:user,admin,owner diff --git a/tests/fixtures/factories/model-modifiers.php b/tests/fixtures/factories/model-modifiers.php index 1fd22d64..6c566f7d 100644 --- a/tests/fixtures/factories/model-modifiers.php +++ b/tests/fixtures/factories/model-modifiers.php @@ -10,7 +10,8 @@ 'title' => $faker->sentence(4), 'name' => $faker->name, 'content' => $faker->paragraphs(3, true), - 'total' => $faker->randomFloat(), + 'amount' => $faker->randomFloat(3, 0, 999999.999), + 'total' => $faker->randomFloat(2, 0, 99999999.99), 'ssn' => $faker->ssn, 'role' => $faker->randomElement(["user","admin","owner"]), ]; diff --git a/tests/fixtures/migrations/modifiers.php b/tests/fixtures/migrations/modifiers.php index daf7a048..48f5218f 100644 --- a/tests/fixtures/migrations/modifiers.php +++ b/tests/fixtures/migrations/modifiers.php @@ -18,6 +18,7 @@ public function up() $table->string('title')->nullable(); $table->string('name', 1000)->unique()->charset('utf8'); $table->string('content')->default(''); + $table->float('amount', 9, 3); $table->decimal('total', 10, 2); $table->char('ssn', 11); $table->enum('role', ["user","admin","owner"]);