Столбец типа enum может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.
Пример создания поля Статус (status) в таблице Задачи (tasks) :
| Field name | Type | Is Nullable | Is Immutable | Default |
|---|---|---|---|---|
stage |
enum('backlog', 'new', 'in_progress', 'done') |
false |
false |
'new' |
Список значений поля можно получить из SQL запроса, используя конструкцию
SELECT value
FROM DOMAIN OF FIELD pm.tasks.status as statuses
Результат этого запроса для примера выше
| statuses.value |
|---|
backlog |
new |
in_progress |
done |
Перечисление значений через запятую:
SELECT string_agg(value, ', ') as lst
FROM DOMAIN OF FIELD pm.tasks.status as statuses
| statuses.lst |
|---|
'backlog', 'new', 'in_progress', 'done' |
Атрибуты (field_attributes) можно присваивать каждому значению enum-а с помощью mapping. Имена атрибутов могут быть произвольными (в рамках допустимых имен)
@{
attribute = mapping
WHEN 'enum_val1' THEN 'attr_value1'
WHEN 'enum_val2' THEN 'attr_value2'
-- ...
END
}
Атрибуты поля tasks.status
@{
-- Field attributes --
caption = 'Status',
soft_disabled = is_archived,
text_align = 'center',
cell_variant = CASE WHEN is_archived THEN 'light' END,
-- Values attributes --
option_variant = mapping
WHEN 'backlog' THEN 'outline-secondary'
WHEN 'new' THEN 'outline-info'
WHEN 'in_progress' THEN 'outline-warning'
WHEN 'done' THEN 'outline-success'
END,
icon = mapping
WHEN 'backlog' THEN 'lightbulb'
WHEN 'new' THEN 'flag'
WHEN 'in_progress' THEN 'notifications'
WHEN 'done' THEN 'done_all'
END,
order_number = mapping
WHEN 'backlog' THEN 3
WHEN 'new' THEN 1
WHEN 'in_progress' THEN 2
WHEN 'done' THEN 4
END
}
textАтрибут text заменяет caption для каждого из значений enum-а - устанавливает "название", которое будет отображаться в интерфейсе у пользователей.
@{
text = mapping
WHEN 'backlog' THEN 'Идеи'
WHEN 'new' THEN 'Новое'
WHEN 'in_progress' THEN 'В работе'
WHEN 'done' THEN 'Завершено'
END
}
В случаях, где необходимо установить атрибуты для поля, являющегося "массивом перечислимых значений" (array(enum('backlog', 'new', 'in_progress', 'done'))) вместо mapping используется array mapping:
{
$status array(enum('backlog', 'new', 'in_progress', 'done')) null @{
caption = 'Status',
text = array mapping
WHEN 'backlog' THEN 'Ideas'
WHEN 'new' THEN 'New'
WHEN 'in_progress' THEN 'In progress'
WHEN 'done' THEN 'Done'
END
}
}:
SELECT id
FROM pm.tasks
WHERE ($status IS NULL OR status = ANY($status))
В озме поддерживаются операторы .@ и .@@, которые позволяют получить значения атрибутов поля и сущности соответственно.
SELECT @type = 'board',
status.@text as status @{
option_variant = status.@option_variant,
icon = status.@icon
},
subject,
due_date,
status as s @{
visible = false,
board_group = true
},
FROM pm.tasks
ORDER BY status.@order_number
status.@text - возвращает 'Новое' для записей в статусе new, 'В работе' для записей в статусе in_progress и т.д.status.@icon и status.@option_variant, status.@order_number - возвращают значения атрибутов, соответствующие указанному статусу записи