Для колонок с типом reference
можно указать опцию ON DELETE CASCADE
. Тогда при удалении записи, на которую ведет ссылка будет удалена и текущая запись.
Подробнее про ON DELETE CASCADE:
Рассмотрим задание колонки любой таблицы (public.column_fields
):
Name | Type | Is nullable |
---|---|---|
entity_id |
reference(public.entities) on delete cascade |
false |
name |
string |
false |
type |
string |
false |
default |
string |
true |
is_immutable |
bool |
false |
is_nullable |
bool |
false |
Колонка entity_id
- ссылка на сущность, задана таким образом, что при удалении сущности, указанной в entity_id
каскадно будут удалены все её колонки.
В FunAPI
есть вызов, позволяющий удалить запись и все ссылки на нее
// action: "user"."delete_recursive"
export default async function deleteRecursive(args) {
const entity = args.entity;
const id = args.id;
const info = await FunDB.getRelatedEntities(entity, id);
FunDB.writeEvent(JSON.stringify(info, null, 3));
await FunDB.recursiveDeleteEntity(entity, id);
return { ok: true }
}
getRelatedEntities
возвращает объект со ссылками на конкретную указанную запись;recursiveDeleteEntity
удаляет все ссылки на запись и саму запись.Кнопка на форме:
{ $id reference(base.people) }:
SELECT
@type = 'form',
@buttons = [{
caption: 'Delete Record', display: 'desktop',
action: { schema: 'user', name: 'delete_recursive' },
args: {
entity: { schema: 'base', name: 'people' },
id: $id
}
}]
...