A pure enum has cases and nothing behind them, which makes it useless for a database column and exactly right for a distinction that only exists inside the program.
enum Direction
{
case Ascending;
case Descending;
}
$d = Direction::Ascending;
$d->name; // 'Ascending' — the only thing available
$d->value; // Error: undefined property
Direction::cases(); // [Direction::Ascending, Direction::Descending]
The absence of a value is a design decision rather than an omission: a pure case is identified by nothing except itself, so there is no scalar to store, serialise or accidentally compare against a string. name exists and is tempting to persist, and persisting it recreates every problem a backed enum solves properly — a rename becomes a data migration nobody notices is needed. If the value has to leave the process, it wanted to be backed.