diff --git a/src/Adapter/DefaultAdapterTrait.php b/src/Adapter/DefaultAdapterTrait.php index 9c4cf8b..1d9f75b 100644 --- a/src/Adapter/DefaultAdapterTrait.php +++ b/src/Adapter/DefaultAdapterTrait.php @@ -104,7 +104,7 @@ trait DefaultAdapterTrait public function generateAlterColumn(FieldDefinition $definition, array $field) : string|\Stringable { if ($field['previous']) { - $position = sprintf('AFTER %s', $adapter->escapeIdentifier($field['previous']['field'], AdapterInterface::IDENTIFIER_FIELD)); + $position = sprintf('AFTER %s', $this->escapeIdentifier($field['previous']['field'], AdapterInterface::IDENTIFIER_FIELD)); } else { $position = "FIRST"; diff --git a/src/Attribute/Attribute.php b/src/Attribute/Attribute.php index 348792b..7072de4 100644 --- a/src/Attribute/Attribute.php +++ b/src/Attribute/Attribute.php @@ -3,13 +3,20 @@ namespace Ulmus\Attribute; use Ulmus\Common\EntityField; +use Ulmus\Repository; class Attribute { - public static function handleArrayField(null|\Stringable|string|array $field) : mixed + public static function handleArrayField(null|\Stringable|string|array $field, null|string|bool $alias = Repository::DEFAULT_ALIAS, string $separator = ', ') : mixed { if ( is_array($field) ) { $class = array_shift($field); + $field[1] ??= $alias; + + if (is_array($field[0])) { + $field[] = $separator; + return $class::fields(...$field); + } return $class::field(...$field); } diff --git a/src/Attribute/Property/Field/ForeignKey.php b/src/Attribute/Property/Field/ForeignKey.php index a2098a8..252fdd4 100644 --- a/src/Attribute/Property/Field/ForeignKey.php +++ b/src/Attribute/Property/Field/ForeignKey.php @@ -10,6 +10,17 @@ use Ulmus\Attribute\Attribute; */ #[\Attribute(\Attribute::TARGET_PROPERTY)] class ForeignKey extends PrimaryKey { + + public const SET_NULL = "null"; + + public const SET_DEFAULT = "default"; + + public const RESTRICT = "restrict"; + + public const NO_ACTION = "noaction"; + + public const CASCADE = "cascade"; + public function __construct( public ? string $name = null, public ? string $type = 'bigint', @@ -22,8 +33,11 @@ class ForeignKey extends PrimaryKey { public bool $nullable = false, public mixed $default = null, public bool $readonly = false, + public null|array|string|\Stringable $foreignKey = "", public null|array|string|\Stringable $references = null, + public null|string $onDelete = self::NO_ACTION, + public null|string $onUpdate = self::NO_ACTION, ) { - $this->references = Attribute::handleArrayField($this->references); + $this->references = Attribute::handleArrayField($this->references, false); } } diff --git a/src/Attribute/Property/Index.php b/src/Attribute/Property/Index.php new file mode 100644 index 0000000..70e6311 --- /dev/null +++ b/src/Attribute/Property/Index.php @@ -0,0 +1,21 @@ +fromArray($dataset); } + public function jsonSerialize(): mixed + { + return $this->toArray(); + } + public function append($value) : void { if ( is_array($value) ) { diff --git a/src/EntityTrait.php b/src/EntityTrait.php index c94f77b..bf2af7e 100644 --- a/src/EntityTrait.php +++ b/src/EntityTrait.php @@ -301,15 +301,15 @@ trait EntityTrait { } #[Ignore] - public static function field($name, ? string $alias = Repository::DEFAULT_ALIAS) : EntityField + public static function field($name, null|string|bool $alias = Repository::DEFAULT_ALIAS) : EntityField { - return new EntityField(static::class, $name, $alias ? Ulmus::repository(static::class)->adapter->adapter()->escapeIdentifier($alias, Adapter\AdapterInterface::IDENTIFIER_FIELD) : Repository::DEFAULT_ALIAS, Ulmus::resolveEntity(static::class)); + return new EntityField(static::class, $name, $alias ? Ulmus::repository(static::class)->adapter->adapter()->escapeIdentifier($alias, Adapter\AdapterInterface::IDENTIFIER_FIELD) : ( $alias === false ? '' : Repository::DEFAULT_ALIAS ), Ulmus::resolveEntity(static::class)); } #[Ignore] - public static function fields(array $fields, ? string $alias = Repository::DEFAULT_ALIAS) : string + public static function fields(array $fields, null|string|bool $alias = Repository::DEFAULT_ALIAS, string $separator = ', ') : string { - return implode(', ', array_map(function($item) use ($alias){ + return implode($separator, array_map(function($item) use ($alias){ return static::field($item, $alias); }, $fields)); }