diff --git a/src/Generators/FactoryGenerator.php b/src/Generators/FactoryGenerator.php index 0bf65382..8db8d052 100644 --- a/src/Generators/FactoryGenerator.php +++ b/src/Generators/FactoryGenerator.php @@ -2,10 +2,10 @@ namespace Blueprint\Generators; +use Blueprint\Contracts\Generator; +use Blueprint\Models\Column; use Blueprint\Models\Model; use Illuminate\Support\Str; -use Blueprint\Models\Column; -use Blueprint\Contracts\Generator; class FactoryGenerator implements Generator { @@ -106,6 +106,12 @@ protected function buildDefinition(Model $model) } elseif ($column->dataType() === 'json') { $default = $column->defaultValue() ?? "'{}'"; $definition .= self::INDENT . "'{$column->name()}' => {$default}," . PHP_EOL; + } elseif ($column->dataType() === 'morphs') { + if ($column->isNullable()) { + continue; + } + $definition .= sprintf('%s%s => $faker->%s,%s', self::INDENT, "'{$column->name()}_id'", self::fakerDataType('id'), PHP_EOL); + $definition .= sprintf('%s%s => $faker->%s,%s', self::INDENT, "'{$column->name()}_type'", self::fakerDataType('string'), PHP_EOL); } else { $definition .= self::INDENT . "'{$column->name()}' => "; $faker = self::fakerData($column->name()) ?? self::fakerDataType($column->dataType()); diff --git a/src/Generators/MigrationGenerator.php b/src/Generators/MigrationGenerator.php index 340d109b..1756a9db 100644 --- a/src/Generators/MigrationGenerator.php +++ b/src/Generators/MigrationGenerator.php @@ -111,7 +111,7 @@ protected function buildDefinition(Model $model) $dataType = 'unsigned' . ucfirst($dataType); } - if (in_array($dataType, self::NULLABLE_TYPES) && in_array('nullable', $column->modifiers())) { + if (in_array($dataType, self::NULLABLE_TYPES) && $column->isNullable()) { $dataType = 'nullable' . ucfirst($dataType); } diff --git a/src/Models/Column.php b/src/Models/Column.php index 802b3879..39e34928 100644 --- a/src/Models/Column.php +++ b/src/Models/Column.php @@ -45,4 +45,9 @@ public function defaultValue() return $key === 'default'; }); } + + public function isNullable() + { + return in_array('nullable', $this->modifiers); + } } diff --git a/tests/Unit/Models/ColumnTest.php b/tests/Unit/Models/ColumnTest.php new file mode 100644 index 00000000..58c5ed97 --- /dev/null +++ b/tests/Unit/Models/ColumnTest.php @@ -0,0 +1,18 @@ +assertTrue((new Column('foo', 'string', ['nullable']))->isNullable()); + + $this->assertFalse((new Column('foo', 'string', []))->isNullable()); + $this->assertFalse((new Column('foo', 'string', ['something']))->isNullable()); + } +} diff --git a/tests/fixtures/definitions/phone.bp b/tests/fixtures/definitions/phone.bp index 615761b7..3970b0b7 100644 --- a/tests/fixtures/definitions/phone.bp +++ b/tests/fixtures/definitions/phone.bp @@ -5,3 +5,5 @@ models: phone_number: text type: enum:home,cell status: set:archived,deleted + foo: morphs + bar: morphs nullable \ No newline at end of file diff --git a/tests/fixtures/factories/phone.php b/tests/fixtures/factories/phone.php index a32378ad..2fabb31e 100644 --- a/tests/fixtures/factories/phone.php +++ b/tests/fixtures/factories/phone.php @@ -12,5 +12,7 @@ 'phone_number' => $faker->phoneNumber, 'type' => $faker->randomElement(["home","cell"]), 'status' => $faker->randomElement(["archived","deleted"]), + 'foo_id' => $faker->randomDigitNotNull, + 'foo_type' => $faker->word, ]; });