48 lines
1.5 KiB
PHP
48 lines
1.5 KiB
PHP
<?php
|
|
namespace DatabaseHelper\enums;
|
|
enum ColumnTypes
|
|
{
|
|
case INT;
|
|
case FLOAT;
|
|
case STRING;
|
|
case BOOL;
|
|
case ARRAY;
|
|
case DATE;
|
|
|
|
public function cast(mixed $value): mixed {
|
|
return match ($this) {
|
|
self::INT => (int) $value,
|
|
self::FLOAT => (float) $value,
|
|
self::STRING => (string) $value,
|
|
self::BOOL => (bool) $value,
|
|
self::ARRAY => is_array($value) ? $value : json_decode($value, true),
|
|
self::DATE => $value instanceof \DateTime ? $value : new \DateTime($value),
|
|
};
|
|
}
|
|
|
|
public function isCastable(mixed $value): bool {
|
|
try {
|
|
return match ($this) {
|
|
self::INT, self::FLOAT => is_numeric($value),
|
|
self::STRING => is_scalar($value) || (is_object($value) && method_exists($value, '__toString')),
|
|
self::BOOL => is_bool($value) || in_array($value, [0, 1, '0', '1'], true),
|
|
self::ARRAY => is_array($value) || is_string($value) && json_decode($value, true) !== null,
|
|
self::DATE => $value instanceof \DateTime || (is_string($value) && strtotime($value) !== false),
|
|
};
|
|
} catch (\Throwable $e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function type(): string {
|
|
return match ($this) {
|
|
self::INT => 'INTEGER',
|
|
self::FLOAT => 'FLOAT',
|
|
self::STRING => 'VARCHAR(255)',
|
|
self::BOOL => 'BOOLEAN',
|
|
self::ARRAY => 'JSON',
|
|
self::DATE => 'DATETIME',
|
|
};
|
|
}
|
|
}
|