Skip to content

Commit

Permalink
fix: handle enum db columns correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
canvural committed Dec 23, 2022
1 parent 2e4317c commit f4ffec0
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 6 deletions.
20 changes: 14 additions & 6 deletions src/Properties/ModelPropertyExtension.php
Expand Up @@ -143,32 +143,40 @@ public function getProperty(

if ($this->hasDate($modelInstance, $propertyName)) {
$readableType = $this->modelCastHelper->getDateType();
$writeableType = TypeCombinator::union($this->modelCastHelper->getDateType(), new StringType());
$writableType = TypeCombinator::union($this->modelCastHelper->getDateType(), new StringType());
} elseif ($modelInstance->hasCast($propertyName)) {
$cast = $modelInstance->getCasts()[$propertyName];

$readableType = $this->modelCastHelper->getReadableType(
$cast,
$this->stringResolver->resolve($column->readableType),
);
$writeableType = $this->modelCastHelper->getWriteableType(
$writableType = $this->modelCastHelper->getWriteableType(
$cast,
$this->stringResolver->resolve($column->writeableType),
);
} else {
$readableType = $this->stringResolver->resolve($column->readableType);
$writeableType = $this->stringResolver->resolve($column->writeableType);
if (in_array($column->readableType, ['enum', 'set'], true)) {
if ($column->options === null || count($column->options) < 1) {
$readableType = $writableType = new StringType();
} else {
$readableType = $writableType = $this->stringResolver->resolve('\''.implode('\'|\'', $column->options).'\'');
}
} else {
$readableType = $this->stringResolver->resolve($column->readableType);
$writableType = $this->stringResolver->resolve($column->writeableType);
}
}

if ($column->nullable) {
$readableType = TypeCombinator::addNull($readableType);
$writeableType = TypeCombinator::addNull($writeableType);
$writableType = TypeCombinator::addNull($writableType);
}

return new ModelProperty(
$classReflection,
$readableType,
$writeableType,
$writableType,
);
}

Expand Down
Expand Up @@ -31,6 +31,7 @@ public function up(): void
$table->boolean('blocked');
$table->unknownColumnType('unknown_column');
$table->rememberToken();
$table->enum('enum_status', ['active', 'inactive']);

// Testing property casts
$table->integer('int');
Expand Down
1 change: 1 addition & 0 deletions tests/Type/data/model-properties.php
Expand Up @@ -34,6 +34,7 @@
assertType(CarbonImmutable::class, $user->immutable_date);
assertType(CarbonImmutable::class, $user->immutable_datetime);
assertType('int', $user->timestamp);
assertType('\'active\'|\'inactive\'', $user->enum_status);

// CastsAttributes
assertType('App\ValueObjects\Favorites', $user->favorites);

0 comments on commit f4ffec0

Please sign in to comment.